记录编号 |
230837 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[BZOJ 2820] YY的GCD |
最终得分 |
100 |
用户昵称 |
stdafx.h |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
25.707 s |
提交时间 |
2016-02-24 12:06:42 |
内存使用 |
62.36 MiB |
显示代码纯文本
#define maxn 10030ul
#define maxe 10000030ul
#define ll long long
#include <stdio.h>
#include <algorithm>
int n[maxn],m[maxn],T,max_limit,prime[maxe>>3],sum[maxe];
char mu[maxe];bool isp[maxe];
inline int in(){
int x=0,c=getchar();
while(c<'0'||c>'9') c=getchar();
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
return x;
}
inline int Min(int a,int b){
return a<b?a:b;
}
inline int Max(int a,int b){
return a>b?a:b;
}
inline ll Work(ll n,ll m){
ll ans=0;
for(ll i=1,last;i<=n;i=last+1){
last=Min(n/(n/i),m/(m/i));
ans+=(n/i)*(m/i)*((ll)(sum[last]-sum[i-1]));
}
return ans;
}
int main(){
freopen("YYnoGCD.in","r",stdin);
freopen("YYnoGCD.out","w",stdout);
T=in();
for(int i=1;i<=T;i++){
n[i]=in(),m[i]=in();
if(n[i]>m[i]) std::swap(n[i],m[i]);
}
for(int i=1;i<=T;i++) max_limit=Max(max_limit,n[i]);
max_limit+=10;mu[1]=1;
for(int i=2;i<max_limit;i++){
if(!isp[i]) prime[++prime[0]]=i,mu[i]=-1;
for(int j=1,x;j<=prime[0]&&i*prime[j]<max_limit;j++){
x=i*prime[j];isp[x]=true;
if(i%prime[j]) mu[x]=-mu[i];
else{mu[x]=0;break;}
}
}
for(int i=1;i<=prime[0];i++){
for(int k=prime[i],x=prime[i],j=1;k<max_limit;k+=x,j++) sum[k]+=mu[j];
}
for(int i=1;i<max_limit;i++) sum[i]+=sum[i-1];
for(int i=1;i<=T;i++) printf("%lld\n",Work(n[i],m[i]));
return 0;
}