80pts WA on#2#10求助
查看原帖
80pts WA on#2#10求助
906856
A2_Zenith楼主2023/12/30 17:40

看了警示后人,可能炸int/ll的地方都取模了,怎么寄掉的不知道。

来个人救一下啊。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll p; 
ll n;
ll inv4;
ll inv6;
ll inv(ll b,ll p){
	ll ans=1;
	ll ex=p-2;
	while(ex){
		if(ex&1)ans=ans*b%p;
		b=b*b%p;
		ex>>=1;
	}
	return ans;
}
const int maxn=4.7e6+7;
ll phi[maxn];
ll pref[maxn];
int pr[maxn];
bool tg[maxn];
int cnt;
void init(){
	phi[1]=1ll;
	for(int i=2;i<=maxn-3;i++){
		if(!tg[i]){
			pr[++cnt]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=cnt&&i*pr[j]<=maxn-3;j++){
			tg[i*pr[j]]=1;
			if(i%pr[j]==0){
				phi[i*pr[j]]=pr[j]*phi[i];
				break;
			}
			phi[i*pr[j]]=phi[i]*phi[pr[j]];
		}
	}
//	cout<<"PHI"<<endl;
	for(int i=1;i<=maxn-3;i++){
		pref[i]=(pref[i-1]+phi[i]*i%p*i%p)%p;
	}
}
unordered_map<ll,ll> mp;
ll sumT3(ll n){
	n%=p;
	return n*(n+1)%p*n%p*(n+1)%p*inv4%p;
}
ll sumT2(ll n){
	n%=p;
	return n*(n+1ll)%p*(2ll*n+1)%p*inv6%p;
}
ll S(ll n){
	if(n<=maxn-3)return pref[n];
	if(mp.count(n))return mp[n];
	ll ans=sumT3(n);
	for(ll l=2,r;l<=n;l=r+1){
		r=n/(n/l);
		ans=((ans-(sumT2(r)-sumT2(l-1))%p*S(n/l)%p)%p+p)%p;
	}
	return mp[n]=ans;
}
ll TST(int n){
	ll ans=0;
	for(ll l=1,r;l<=n;l=r+1){
		r=n/(n/l);
		ll SSS=((S(r)-S(l-1))%p+p)%p;
		ans=(ans+(n/l)%p*(n/l)%p*(n/l+1)%p*(n/l+1)%p*inv4%p*SSS%p)%p;
	}
	return ans;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);
	cin>>p>>n;
	init();
	inv4=inv(4ll,p);
	inv6=inv(6ll,p);
	cout<<TST(n);
}
2023/12/30 17:40
加载中...