\ [\開始{スプリット} A&= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ nは{ijgcd(I、J)} \\&= \ sum_ {D = 1} ^ n個\ sum_ {i = 1} ^ {\ lfloor \ FRAC {n}は{D} \ rfloor} \ sum_ {J = 1} ^ {\ lfloor \ FRAC {n}は{D} \ rfloor} IJD ^ 3 [GCD( I、J)= 1] \\&= \ sum_ {D = 1} ^ ND ^ 3 \ sum_ {I = 1} ^ {\ lfloor \ FRAC {n}は{D} \ rfloor} \ sum_ {J = 1 } ^ {\ lfloor \ FRAC {n}は{D} \ rfloor} IJ [GCD(I、J)= 1] \端{スプリット} \]
设\(F(N)= \ sum_ {iが1} ^ = {N} \ sum_ {J = 1} ^ NIJ [GCD(I、J)= 1] \)、 \(S(N)= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ NIJ \)
则
\ [\開始{スプリット} A&= \ sum_ {D = 1} ^ ND ^ 3F(\ lfloor \ FRAC {n}は{D} \ rfloor)\端{スプリット} \]
と
\ [\ sum_ {I = 1} ^ {n}はI ^ 3 =(\ sum_ ^ NI {iは= 1})^ 2 = [\ FRAC {N(N + 1)} {2}] ^ 2 \]
持っています
\ [\開始{スプリット} S(N)&= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ NIJ = [\ FRAC {N(N + 1)} {2}] ^ 2 \\&= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ NIJ \\&= \ sum_ {T = 1} ^ {N} \ sum_ {I = 1} ^ {\ lfloor \ FRAC {N}、{T} \ rfloor} \ sum_ {J = 1} ^ {\ lfloor \ FRAC {N}、{T} \ rfloor} T ^ 2ij [GCD(I、J)= 1] \\& = \ sum_ {T = 1} ^ {n}はT ^ 2F(\ lfloor \ FRAC {N}、{T} \ rfloor)= F(N)+ \ sum_ {T> 1} T ^ 2F(\ lfloor \ FRAC {N}、{T} \ rfloor)\端{スプリット} \]
\ [F(N)= S(N) - \ sum_ {T> 1} T ^ 2F(\ lfloor \ FRAC {N}、{T} \ rfloor)= [\ FRAC {N(N + 1)} {2 }] ^ 2- \ sum_ {T> 1} T ^ 2F(\ lfloor \ FRAC {N}、{T} \ rfloor)\]
ブロック番号に
\ [\ sum_ {I = 1 } ^ {n}はI ^ 2 = \ FRAC {N(N + 1)(2N + 1)} {6} \]
预处理\(F(N)\)
\ [F(N)= \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ NIJ [GCD(I、J)= 1] = F( N-1)+2 \ sum_を{I = 1}で^ {N} [GCD(I、N)= 1] \]
而
\ [\ sum_ ^ {I 1 =}または[GCD(I、N)= 1] N = \ FRAC {\ varphi(N)} {2} \]
故
\、[F、(N)= F(N-1)、2 +、N ^ \ varphi、(n)は、\]
精神障害者の選手が誤ってn個も時間半以上のチューニングので出て死にます
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e6+5;
int i2,i4,i6,mod,n;
bool isNotPrime[N + 5];
int mu[N + 5], phi[N + 5], primes[N + 5], cnt;
inline void euler() {
isNotPrime[0] = isNotPrime[1] = true;
mu[1] = 1;
phi[1] = 1;
for (int i = 2; i <= N; i++) {
if (!isNotPrime[i]) {
primes[++cnt] = i;
mu[i] = -1;
phi[i] = i - 1;
}
for (int j = 1; j <= cnt; j++) {
int t = i * primes[j];
if (t > N) break;
isNotPrime[t] = true;
if (i % primes[j] == 0) {
mu[t] = 0;
phi[t] = phi[i] * primes[j];
break;
} else {
mu[t] = -mu[i];
phi[t] = phi[i] * (primes[j] - 1);
}
}
}
}
inline void exgcd(int a,int b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-(a/b)*y;
}
inline int inv(int a,int b) {
int x,y;
return exgcd(a,b,x,y),(x%b+b)%b;
}
int sum[N+1];
int h(int n) { n%=mod;
return n*n%mod*(n+1)%mod*(n+1)%mod*i4%mod;
}
int u(int n) { n%=mod;
return n*(n+1)%mod*(2ll*n+1)%mod*i6%mod;
}
map<int,int> mp;
int S(int n) {
if(n<N) return sum[n];
if(mp[n]) return mp[n];
int l=2, r, ans=h(n);
while(l<=n) {
r=n/(n/l);
ans -= (((u(r)-u(l-1))%mod+mod)%mod*S(n/l))%mod;
ans %= mod;
ans += mod;
ans %= mod;
l=r+1;
}
mp[n]=ans;
return ans;
}
int read() {
long long t;
cin>>t;
return t;
}
signed main() {
ios::sync_with_stdio(false);
mod=read();
n=read();
i2=inv(2,mod);
i4=inv(4,mod);
i6=inv(6,mod);
euler();
sum[0]=phi[0];
for(int i=1;i<=N;i++) sum[i]=(sum[i-1]+phi[i]%mod*i%mod*i%mod)%mod;
int ans = 0, l=1, r;
while(l<=n) {
//cout<<l<<endl;
r=(n/(n/l));
ans += h(n/l) * ((S(r)-S(l-1)+mod)%mod) % mod;
ans %= mod;
l=r+1;
}
cout<<(long long)ans;
}