求
題解:
設 ,簡單變換髮現 ,是個積性函數,可以考慮線性篩。
然而考慮前綴和
杜教篩維護 的前綴和即可。
代碼:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
using std::cerr;
using std::cout;
int mod,iv2,iv6;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}
inline int po(int a,int b){int r=1;for(;b;b>>=1,Mul(a,a))if(b&1)Mul(r,a);return r;}
inline void ex_gcd(int a,int b,int &x,int &y){
if(!b){x=1,y=0;return ;}ex_gcd(b,a%b,y,x);y-=a/b*x;
}inline int Inv(int a){int x,y;ex_gcd(mod,a,y,x);return x+(x>>31&mod);}
inline int S1(int n){return n*(n+1ll)/2%mod;}
inline int S2(int n){return mul(mul(n,iv6),mul(n+1,n+n+1));}
cs int N=1e6+7,K=1e6;
int n;
int p[N],pc;
bool mrk[N];
int phi[N],Phi[N];
inline int get_phi(int x){
return x<=K?phi[x]:Phi[n/x];
}void init_math(){
phi[1]=1;
for(int re i=2;i<=K;++i){
if(!mrk[i])p[++pc]=i,phi[i]=i-1;
for(int re j=1;i*p[j]<=K;++j){
mrk[i*p[j]]=true;
if(i%p[j])
phi[i*p[j]]=phi[i]*(p[j]-1);
else {
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}for(int re i=1;i<=K;++i)Inc(phi[i],phi[i-1]);
for(int re i=n/K;i;--i){
int n=::n/i;Phi[i]=S1(n);
for(int re l=2,r,u;u=n/l;l=r+1)
Dec(Phi[i],mul(get_phi(u),(r=n/u)-l+1));
}
}
void Main(){
scanf("%d%d",&n,&mod);
init_math();iv6=Inv(6);int ans=0;
for(int re l=1,r,u;u=n/l;l=r+1)
Inc(ans,mul(dec(get_phi(r=n/u),get_phi(l-1)),S2(u)));
cout<<ans<<"\n";
}
inline void file(){
#ifdef zxyoi
freopen("yang.in","r",stdin);
#endif
}signed main(){file();Main();return 0;}