记录编号 359178 评测结果 AAAAAAAAAA
题目名称 最大公约数 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.238 s
提交时间 2016-12-20 22:18:17 内存使用 13.99 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e6+10;
int T,n,m,p[N],a[N],cnt,fac[N],phi[N],num;
void dfs(int pos,int x,int Phi){
	if (pos>cnt){
		fac[++num]=x;
		phi[num]=Phi;
		return;
	}
	dfs(pos+1,x,Phi);
	for (int i=1;i<=a[pos];++i){
		if (i==a[pos]) Phi/=(p[pos]-1);
			else Phi/=p[pos];
		x*=p[pos];dfs(pos+1,x,Phi);
	}
}
void solve(int x){
	num=cnt=0;
	for (int i=2;i*i<=n;++i)
	if (!(x%i)){
		p[++cnt]=i;a[cnt]=0;
		while (!(x%i)) ++a[cnt],x/=i;
	}
	if (x!=1) p[++cnt]=x,a[cnt]=1;
	int Phi=1,ans=0;
	for (int i=1;i<=cnt;i++)
		Phi*=pow(p[i],a[i]-1)*(p[i]-1);
	dfs(1,1,Phi);
	for (int i=1;i<=num;i++)
	if (fac[i]>=m) ans+=phi[i];
	printf("%d\n",ans);
}
int main()
{
	freopen("gcd.in","r",stdin);
	freopen("gcd.out","w",stdout);
	scanf("%d",&T);
	while (T--){
		scanf("%d%d",&n,&m);
		solve(n);
	}
	return 0;
}