呃,很玄学?我没看出来哪里炸了。
#include<bits/stdc++.h>
using namespace std;
const int Max=1e6;
long long n,p,inv6,inv4;
long long f[Max+5];
int pri[Max+5],cnt=0;
bool vis[Max+5];
void Euler_Sieve(int n)
{
vis[1]=1;
f[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
pri[++cnt]=i;
f[i]=i-1;
}
for(int j=1;j<=cnt&&1ll*i*pri[j]<=n;j++)
{
vis[i*pri[j]]=1;
//cout<<i*pri[j]<<'\n';
f[i*pri[j]]=f[i]*(pri[j]-1)%p;
if(i%pri[j]==0)
{
f[i*pri[j]]+=f[i];
f[i*pri[j]]%=p;
break;
}
}
}
for(int i=2;i<=n;i++)
{
f[i]=(f[i-1]+f[i]*i%p*i%p)%p;//if(i<=2000)cout<<f[i]<<' '<<phi[i]<<"|";
}
}
map<long long,long long> dp;
long long ksm(long long a,long long b)
{
long long ans=1;
a%=p;
while(b)
{
if(b&1)
{
ans*=a;
ans%=p;
}
a*=a;
a%=p;
b>>=1;
}
return ans;
}
long long inv(long long a)
{
return ksm(a,p-2);
}
long long h(long long n)
{
return n*(n+1)%p*(n*2%p+1)*inv6%p;
}
long long g(long long n)
{
return n*n%p*(n+1)%p*(n+1)%p*inv4%p;
}
long long getf(long long n)
{
if(n<=Max)
{
return f[n];
}
if(dp[n])
{
return dp[n];
}
long long ans=n*n%p*(n+1)%p*(n+1)%p*inv4%p,l=1,r=0;
while(l<=n)
{
r=n/(n/l);
ans-=(h(r)-h(l-1))%p*getf(n/l)%p;
ans%=p;
l=r+1;
}
return dp[n]=ans;
}
int main()
{
cin>>p>>n;
inv4=inv(4);
inv6=inv(6);
Euler_Sieve(Max);
long long ans=0,l=1,r=0;
while(l<=n)
{
r=n/(n/l);
ans+=(getf(r)-getf(l-1))%p*g(n/l)%p;
ans%=p;
l=r+1;
}
cout<<(ans+p)%p;
return 0;
}