记录编号 230837 评测结果 AAAAAAAAAA
题目名称 [BZOJ 2820] YY的GCD 最终得分 100
用户昵称 Gravatarstdafx.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;
}