題意
給定n和p(p爲質數)求∑ i = 1 n ∑ j = 1 n i j g c d ( i , j ) % p \sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\% p i = 1 ∑ n j = 1 ∑ n i j g c d ( i , j ) % p
n ≤ 1 0 10 , 5 × 1 0 8 ≤ p ≤ 1.1 × 1 0 9 n\le 10^{10},5\times 10^8\le p\le1.1 \times 10^9 n ≤ 1 0 1 0 , 5 × 1 0 8 ≤ p ≤ 1 . 1 × 1 0 9
思路
經典的先提出gcd
= ∑ d = 1 n d ∑ i = 1 n ∑ j = 1 n i j [ g c d ( i , j ) = = d ] =\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d] = d = 1 ∑ n d i = 1 ∑ n j = 1 ∑ n i j [ g c d ( i , j ) = = d ]
後面的部分除以d,有
= ∑ d = 1 n d ∑ i = 1 n d ∑ j = 1 n d d i d j [ g c d ( i , j ) = = 1 ] =\sum_{d=1}^nd\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}di\ dj[gcd(i,j)==1] = d = 1 ∑ n d i = 1 ∑ d n j = 1 ∑ d n d i d j [ g c d ( i , j ) = = 1 ]
提出後面的d
= ∑ d = 1 n d 3 ∑ i = 1 n d ∑ j = 1 n d i j [ g c d ( i , j ) = = 1 ] =\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij[gcd(i,j)==1] = d = 1 ∑ n d 3 i = 1 ∑ d n j = 1 ∑ d n i j [ g c d ( i , j ) = = 1 ]
然後進行莫比烏斯反演,將∑ d ∣ n μ ( d ) = [ n = = 1 ] \sum_{d|n}\mu(d)=[n==1] ∑ d ∣ n μ ( d ) = [ n = = 1 ] 帶入有
= ∑ d = 1 n d 3 ∑ i = 1 n d ∑ j = 1 n d i j ∑ k ∣ g c d ( i , j ) μ ( k ) =\sum_{d=1}^nd^3\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}ij\sum_{k|gcd(i,j)}\mu(k) = d = 1 ∑ n d 3 i = 1 ∑ d n j = 1 ∑ d n i j k ∣ g c d ( i , j ) ∑ μ ( k )
將k提出有,及枚舉1到n d \frac{n}{d} d n 內k的倍數
= ∑ d = 1 n d 3 ∑ k = 1 n d μ ( k ) ∑ i = 1 n d k ∑ j = 1 n d k k i k j =\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ki\ kj = d = 1 ∑ n d 3 k = 1 ∑ d n μ ( k ) i = 1 ∑ d k n j = 1 ∑ d k n k i k j
= ∑ d = 1 n d 3 ∑ k = 1 n d μ ( k ) k 2 ∑ i = 1 n d k ∑ j = 1 n d k i j =\sum_{d=1}^nd^3\sum_{k=1}^{\frac{n}{d}}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij = d = 1 ∑ n d 3 k = 1 ∑ d n μ ( k ) k 2 i = 1 ∑ d k n j = 1 ∑ d k n i j
上式等價於
= ∑ d = 1 n d 3 ∑ d k = 1 n μ ( k ) k 2 ∑ i = 1 n d k ∑ j = 1 n d k i j =\sum_{d=1}^nd^3\sum_{dk=1}^{n}\mu(k)k^2\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{n}{dk}}ij = d = 1 ∑ n d 3 d k = 1 ∑ n μ ( k ) k 2 i = 1 ∑ d k n j = 1 ∑ d k n i j
令T = d k T=dk T = d k 有
= ∑ d = 1 n d 3 ∑ T = 1 n [ T % d = = 0 ] μ ( T d ) ( T d ) 2 ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{d=1}^nd^3\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})(\frac{T}{d})^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij = d = 1 ∑ n d 3 T = 1 ∑ n [ T % d = = 0 ] μ ( d T ) ( d T ) 2 i = 1 ∑ T n j = 1 ∑ T n i j
我們將d 3 d^3 d 3 乘入
= ∑ d = 1 n ∑ T = 1 n [ T % d = = 0 ] μ ( T d ) d T 2 ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{d=1}^n\sum_{T=1}^{n}[T\% d==0]\mu(\frac{T}{d})dT^2\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij = d = 1 ∑ n T = 1 ∑ n [ T % d = = 0 ] μ ( d T ) d T 2 i = 1 ∑ T n j = 1 ∑ T n i j
這裏可以看作枚舉的是1到n中每一個d的倍數,那麼我們也等價於枚舉1到n中每個數T的因子
= ∑ T = 1 n T 2 ∑ d ∣ T d μ ( T d ) ∑ i = 1 n T ∑ j = 1 n T i j =\sum_{T=1}^nT^2\sum_{d|T}d\mu(\frac{T}{d})\sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij = T = 1 ∑ n T 2 d ∣ T ∑ d μ ( d T ) i = 1 ∑ T n j = 1 ∑ T n i j
對於式子∑ i = 1 n T ∑ j = 1 n T i j \sum_{i=1}^{\frac{n}{T}}\sum_{j=1}^{\frac{n}{T}}ij i = 1 ∑ T n j = 1 ∑ T n i j
有
∑ i = 1 n T i ∑ j = 1 n T j = ∑ i = 1 n T i ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) = ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) 2 \sum_{i=1}^{\frac{n}{T}}i\sum_{j=1}^{\frac{n}{T}}j=\sum_{i=1}^{\frac{n}{T}}i(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})=(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2 i = 1 ∑ T n i j = 1 ∑ T n j = i = 1 ∑ T n i ( 2 ( ⌊ T n ⌋ + 1 ) ⌊ T n ⌋ ) = ( 2 ( ⌊ T n ⌋ + 1 ) ⌊ T n ⌋ ) 2
對於式子∑ d ∣ T d μ ( T d ) \sum_{d|T}d\mu(\frac{T}{d}) ∑ d ∣ T d μ ( d T ) 可以發現是i d id i d 於μ \mu μ 的狄利克雷卷積i d ∗ μ = φ id*\mu=\varphi i d ∗ μ = φ
所以有
= ∑ T = 1 n T 2 φ ( T ) ( ( ⌊ n T ⌋ + 1 ) ⌊ n T ⌋ 2 ) 2 =\sum_{T=1}^nT^2\varphi(T)(\frac{(\left \lfloor \frac{n}{T}\right \rfloor+1)\left \lfloor\frac{n}{T}\right \rfloor}{2})^2 = T = 1 ∑ n T 2 φ ( T ) ( 2 ( ⌊ T n ⌋ + 1 ) ⌊ T n ⌋ ) 2
然後可以對
∑ T = 1 n T 2 φ ( T ) \sum_{T=1}^nT^2\varphi(T) T = 1 ∑ n T 2 φ ( T ) 用杜教篩
令f ( x ) = x 2 φ ( x ) f(x)=x^2\varphi(x) f ( x ) = x 2 φ ( x ) ,g ( x ) = x 2 g(x)=x^2 g ( x ) = x 2 ,S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^nf(i) S ( n ) = ∑ i = 1 n f ( i )
∑ i = 1 n g ∗ f = ∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) = ∑ i = 1 n ∑ d ∣ i d 2 ( i d ) 2 φ ( i d ) \sum_{i=1}^ng*f=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{i=1}^n\sum_{d|i}d^2(\frac{i}{d})^2\varphi(\frac{i}{d}) i = 1 ∑ n g ∗ f = i = 1 ∑ n d ∣ i ∑ g ( d ) f ( d i ) = i = 1 ∑ n d ∣ i ∑ d 2 ( d i ) 2 φ ( d i )
= ∑ i = 1 n i 2 ∑ d ∣ i φ ( i d ) =\sum_{i=1}^ni^2\sum_{d|i}\varphi(\frac{i}{d}) = i = 1 ∑ n i 2 d ∣ i ∑ φ ( d i )
有∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n ∑ d ∣ n φ ( d ) = n ,故
= ∑ i = 1 n i 3 =\sum_{i=1}^ni^3 = i = 1 ∑ n i 3
再看∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) \sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d}) ∑ i = 1 n ∑ d ∣ i g ( d ) f ( d i )
考慮枚舉每個因子的倍數
∑ i = 1 n ∑ d ∣ i g ( d ) f ( i d ) = ∑ d = 1 n g ( d ) ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n g ( d ) S ( ⌊ n d ⌋ ) \sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})=\sum_{d=1}^ng(d)\sum_{i=1}^{\left \lfloor\frac{n}{d}\right \rfloor}f(i)=\sum_{d=1}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor) i = 1 ∑ n d ∣ i ∑ g ( d ) f ( d i ) = d = 1 ∑ n g ( d ) i = 1 ∑ ⌊ d n ⌋ f ( i ) = d = 1 ∑ n g ( d ) S ( ⌊ d n ⌋ )
g ( 1 ) S ( n ) + ∑ d = 2 n g ( d ) S ( ⌊ n d ⌋ ) = ∑ i = 1 n i 3 g(1)S(n)+\sum_{d=2}^ng(d)S(\left \lfloor\frac{n}{d}\right \rfloor)=\sum_{i=1}^ni^3 g ( 1 ) S ( n ) + d = 2 ∑ n g ( d ) S ( ⌊ d n ⌋ ) = i = 1 ∑ n i 3
g ( x ) = x 2 g(x)=x^2 g ( x ) = x 2 帶入移項得
S ( n ) = ∑ i = 1 n i 3 − ∑ d = 2 n d 2 S ( ⌊ n d ⌋ ) S(n)=\sum_{i=1}^ni^3-\sum_{d=2}^nd^2S(\left \lfloor\frac{n}{d}\right \rfloor) S ( n ) = i = 1 ∑ n i 3 − d = 2 ∑ n d 2 S ( ⌊ d n ⌋ )
有
∑ i = 1 n i 3 = ( n ( n + 1 ) 2 ) 2 , ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^ni^3=(\frac{n(n+1)}{2})^2,\sum_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6} i = 1 ∑ n i 3 = ( 2 n ( n + 1 ) ) 2 , i = 1 ∑ n i 2 = 6 n ( n + 1 ) ( 2 n + 1 )
用杜教篩就可以做了
注意n大於int,預處理時可能會爆,注意取模
#include <bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int prime[N];
long long phi[N];
int vis[N];
int cnt;
long long mod;
long long inv2;
long long inv4;
long long inv6;
long long quickmod(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b%2==1)
ans=ans*a%mod;
b=b/2;
a=a*a%mod;
}
return ans;
}
void init()
{
cnt=0;
phi[1]=1;
for(int i=2;i<N;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;j<cnt&&i*prime[j]<N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(int i=1;i<N;i++)
phi[i]=(phi[i-1]+1ll*i*i%mod*phi[i]%mod)%mod;
}
map<long long,long long>P;
long long Sum2(long long n)
{
return n%mod*((n+1)%mod)%mod*(2*n%mod+1)%mod*inv6%mod;
}
long long Sum(long long n)
{
if(n<N) return phi[n];
if(P[n]) return P[n];
long long sum=n%mod*((n+1)%mod)%mod*(n%mod)%mod*((n+1)%mod)%mod*inv4%mod;
for(long long i=2,last;i<=n;i=last+1)
{
last=n/(n/i);
sum=(sum-(Sum2(last)-Sum2(i-1)+mod)%mod*Sum(n/i)%mod+mod)%mod;
}
return P[n]=sum;
}
int main()
{
long long n;
scanf("%lld%lld",&mod,&n);
init();
inv2=quickmod(2,mod-2);
inv4=quickmod(4,mod-2);
inv6=quickmod(6,mod-2);
long long sum=0;
for(long long i=1,last;i<=n;i=last+1)
{
last=n/(n/i);
sum=(sum+(Sum(last)-Sum(i-1)+mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*((n/i+1)%mod)%mod*((n/i)%mod)%mod*inv4%mod)%mod;
}
printf("%lld\n",sum);
return 0;
}