萌新求助,一直WA60
查看原帖
萌新求助,一直WA60
98490
houzhiyuan楼主2022/3/2 08:29

一直找不到哪里没取模。

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N=5e6+5;
int mod,Inv6,cnt,p[N],b[N],phi[N],S[N];
unordered_map<ll,int> mp;
int kuai(int a,int b){
	int ans=1;
	for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*a*ans%mod;
	return ans;
}
void work(int maxn){
	phi[1]=1;
	for(int i=2;i<=maxn;i++){
		if(!b[i])p[++cnt]=i,phi[i]=i-1;
		for(int j=1;j<=cnt&&p[j]*i<=maxn;j++){
			b[p[j]*i]=1;
			if(i%p[j]==0){
				phi[i*p[j]]=phi[i]*p[j];
				break;
			}
			phi[i*p[j]]=phi[i]*(p[j]-1);
		}
	}
	for(int i=1;i<=maxn;i++)S[i]=(S[i-1]+1ll*phi[i]*i%mod*i%mod)%mod;
}
int F(ll n){n%=mod;return 1ll*n*(n+1)/2%mod*(1ll*n*(n+1)/2%mod)%mod;}
int F1(ll n){n%=mod;return 1ll*n*(n+1)%mod*(2*n%mod+1)%mod*Inv6%mod;}
int get_S(ll n){
	if(n<=5e6)return S[n];
	if(mp.count(n))return mp[n];
	int ans=1ll*(n%mod)*(n%mod)%mod*(n%mod)%mod;ll r=0;
	for(ll l=2;l<=n;l=r+1){
		r=n/(n/l);
		ans=(ans-1ll*(F1(r)-F1(l-1)+mod)*get_S(n/l)%mod+mod)%mod;
	}
	return mp[n]=ans;
}
int get_ans(ll n){
	int ans=0;ll r=0;
	for(ll l=1;l<=n;l=r+1){
		r=n/(n/l);
		ans=(ans+1ll*(get_S(r)-get_S(l-1)+mod)%mod*F(n/l)%mod)%mod;
	}
	return ans;
}
int n;
signed main(){
	scanf("%lld%lld",&mod,&n);
	Inv6=kuai(6,mod-2);
	work(5e6);
	printf("%lld",get_ans(n));
} 
/*
1000000007 10000000000
*/
2022/3/2 08:29
加载中...