解题思路
对于一个点
(x,y)
,设
gcd(x,y)=t
,点
(x,y)
对答案的贡献为
(t−1)×2+1=t×2−1
。
用
f[i]
表示最大公因数为
i
的
代码:
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
ll f[1000005],n,m,p,ans;
int main(){
scanf("%lld%lld",&n,&m);
p=min(n,m);
for(ll i=p;i>=1;i--){
f[i]=(n/i)*(m/i);
for(ll j=i*2;j<=p;j+=i) f[i]-=f[j];
ans+=f[i]*(i*2-1);
}
printf("%lld",ans);
return 0;
}