记录编号 |
359178 |
评测结果 |
AAAAAAAAAA |
题目名称 |
最大公约数 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
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;
}