链接:https://ac.nowcoder.com/acm/contest/549/J
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小A最近开始研究数论题了,这一次他随手写出来一个式子,∑ni=1∑mj=1gcd(i,j)2
考虑gcd的取值,得,
所以可以考虑 gcd(i,j)==d 一共有多少种,用容斥的方法,
1的倍数的 n*m
2的倍数的 n/2*m/2
3的倍数的 n/3*m/3
...
所以d的倍数的,得减去 2*d,3*d,4*d,...的结果,最后剩下的就是gcd(i,j)==d的结果了
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define rep(i,a,b) for(int i=a;i<b;++i)
const int N=1e6+10;
const int mod=1000000007;
LL f[N];
int main(){
LL n,m;
scanf("%lld %lld",&n,&m);
LL res=0;
for(int i=min(n,m);i>=1;i--){
f[i]=(n/i)*(m/i);//这里的括号必须有,要不然,会出错
for(int j=i*2;j<=min(n,m);j+=i)
f[i]-=f[j];
res=(res+f[i]*i%mod*i%mod)%mod;
}
printf("%lld\n",res);
return 0;
}