题意:
给定n,m,p,要求计算:
a
n
s
=
∑
i
=
1
n
∑
j
=
1
m
d
(
i
)
d
(
j
)
d
(
g
c
d
(
i
,
j
)
)
ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)d(gcd(i,j))
ans=∑i=1n∑j=1md(i)d(j)d(gcd(i,j))
答案对p取模。
其中d(x)=x的约数个数。
数据范围:n,m<=2e6,p<=1e9
解法:
a n s = ∑ i = 1 n ∑ j = 1 m d ( i ) d ( j ) d ( g c d ( i , j ) ) 因 为 d ( g c d ( i , j ) ) = ∑ k ∣ i , k ∣ j 1 , 所 以 : a n s = ∑ i = 1 n ∑ j = 1 m d ( i ) d ( j ) ∑ k ∣ i , k ∣ j 1 考 虑 枚 举 k : a n s = ∑ k = 1 m i n ( n , m ) ∑ k ∣ i , i < = n ∑ k ∣ j , j < = m d ( i ) d ( j ) a n s = ∑ k = 1 m i n ( n , m ) ∑ k ∣ i , i < = n d ( i ) ∑ k ∣ j , j < = m d ( j ) O ( n ∗ l o g n ) 预 处 理 一 下 : f [ k ] = ∑ k ∣ i , i < = n d ( i ) g [ k ] = ∑ k ∣ j , j < = m d ( j ) ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)d(gcd(i,j))\\ 因为d(gcd(i,j))=\sum_{k|i,k|j}1,所以:\\ ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)\sum_{k|i,k|j}1\\ 考虑枚举k:\\ ans=\sum_{k=1}^{min(n,m)}\sum_{k|i,i<=n}\sum_{k|j,j<=m}d(i)d(j)\\ ans=\sum_{k=1}^{min(n,m)}\sum_{k|i,i<=n}d(i)\sum_{k|j,j<=m}d(j)\\ O(n*logn)预处理一下:\\ f[k]=\sum_{k|i,i<=n}d(i)\\ g[k]=\sum_{k|j,j<=m}d(j)\\ ans=i=1∑nj=1∑md(i)d(j)d(gcd(i,j))因为d(gcd(i,j))=k∣i,k∣j∑1,所以:ans=i=1∑nj=1∑md(i)d(j)k∣i,k∣j∑1考虑枚举k:ans=k=1∑min(n,m)k∣i,i<=n∑k∣j,j<=m∑d(i)d(j)ans=k=1∑min(n,m)k∣i,i<=n∑d(i)k∣j,j<=m∑d(j)O(n∗logn)预处理一下:f[k]=k∣i,i<=n∑d(i)g[k]=k∣j,j<=m∑d(j)
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
int d[maxm];
int f[maxm];
int g[maxm];
int n,m,mod;
signed main(){
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<maxm;i++){
for(int j=i;j<maxm;j+=i){
d[j]=(d[j]+1)%mod;
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
f[i]=(f[i]+d[j])%mod;
}
}
for(int i=1;i<=m;i++){
for(int j=i;j<=m;j+=i){
g[i]=(g[i]+d[j])%mod;
}
}
int ans=0;
for(int k=1;k<=min(n,m);k++){
ans=(ans+1ll*f[k]*g[k]%mod)%mod;
}
printf("%d\n",ans);
return 0;
}