http://www.lydsy.com/JudgeOnline/problem.php?id=2005
∑i=1n∑j=1mgcd(i,j)单组询问,反向递推f(x)表示gcd(i,j)==x的对数f(x)=(n/x)∗(m/x)−∑i=1min(n,m)/xf(x∗i)多组询问∑i=1n∑j=1m∑d|i,d|jmin(i,j)φ(d)=∑d=1min(n,m)φ(d)∗(n/d)∗(m/d)
#include<cstdio>
#include<iostream>
using namespace std;
const int N=1e5+100;
typedef long long LL;
LL f[N];
int main(){
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
LL ans=0;
for(int i=min(a,b);i>=1;i--){
LL cnt=(LL)(a/i)*(b/i);
for(int j=i*2;j<=a&&j<=b;j+=i){
cnt-=f[j];
}
f[i]=cnt;
ans+=f[i]*(i*2-1);
}
printf("%lld\n",ans);
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+100;
typedef long long LL;
int pri[N],pn,vp[N];
LL phi[N];
void init(){
memset(vp,0,sizeof(vp));
int n=100000;
pn=0;
phi[1]=1;
for(int i=2;i<=n;i++){
if(!vp[i]){
pri[pn++]=i;
phi[i]=i-1;
}
for(int j=0;j<pn;j++){
if((LL)i*pri[j]>n)break;
vp[i*pri[j]]=1;
if(i%pri[j]==0){
phi[i*pri[j]]=phi[i]*pri[j];
}
else {
phi[i*pri[j]]=phi[i]*(pri[j]-1);
}
}
}
phi[0]=0;
for(int i=2;i<=n;i++){
phi[i]+=phi[i-1];
}
}
int main(){
#ifdef DouBi
freopen("in.cpp","r",stdin);
#endif // DouBi
int a,b;
init();
while(scanf("%d%d",&a,&b)!=EOF){
int r=min(a,b);
LL ans=0;
while(r>0){
//printf("%d ",r);
int k1=a/r;
int k2=b/r;
int l1=a/(k1+1)+1;
int l2=b/(k2+1)+1;
int l=max(l1,l2);
ans+=(LL)k1*k2*(phi[r]-phi[l-1]);
//printf("%d %d %I64d\n",l,r,ans);
r=l-1;
}
printf("%lld\n",ans*2-(LL)a*b);
}
return 0;
}