萌新求助简单数学题
查看原帖
萌新求助简单数学题
468657
lsj2009Isj2OO9楼主2023/10/5 10:30

rt.

WA=60,应该是杜教筛的问题,但看了半天也没有发现哪里有错,该取模的地方也都取模了。

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define ld long double
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=5e6+5,m=5e6;
int phi[N],n,p;
vector<int> prime;
bool is_prime[N];
unordered_map<int,int> fphi;
int qpow(int a,int b) {
    int res=1,base=a;
    while(b) {
        if(b&1)
            res=res*base%p;
        base=base*base%p; b>>=1;
    }
    return res;
}
int inv2,inv6;
int calc(int x) {
	x%=p;
    return (x+1)*x%p*inv2%p;
}
int calc2(int x) {
	x%=p;
    return x*(x+1)%p*(2*x+1)%p*inv6%p;
}
int sum_phi(int x) {
	if(x<=m)
		return phi[x];
	if(fphi.count(x))
		return fphi[x];
	int ans=calc(x),l=2,r;
	while(l<=x) {
		r=x/(x/l);
		ans=(ans-(calc2(r)-calc2(l-1)+p)%p*sum_phi(x/l)%p+p)%p;
		l=r+1;
	}
	return fphi[x]=ans;
}
void init() {
	is_prime[1]=true; phi[1]=1;
	rep(i,1,m) {
		if(!is_prime[i]) {
			prime.push_back(i); phi[i]=i-1;
		}
		for(auto x:prime) {
			if(i*x>m)
				break;
			is_prime[i*x]=true;
			if(i%x==0) {
				phi[i*x]=phi[i]*x;
				break;
			}
			phi[i*x]=phi[i]*(x-1);
		}
		phi[i]=(phi[i]*i%p*i%p+phi[i-1])%p;
	}
}
signed main() {
	scanf("%lld%lld",&p,&n);
	inv2=qpow(2,p-2); inv6=qpow(6,p-2);
	init();
    int l=1,r,ans=0;
    while(l<=n) {
        r=n/(n/l);
        ans=(ans+calc(n/l)%p*calc(n/l)%p*(sum_phi(r)-sum_phi(l-1)+p)%p)%p;
        l=r+1;
    }
    printf("%lld\n",ans);
	return 0;
}
2023/10/5 10:30
加载中...