看了警示后人,可能炸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);
}