#include using namespace std; int Euler(int n){ int m=n; for(int i=2;i*i<=n;i++){ if(n%i==0)//第一次找到的必为素因子 { m-=m/i;//把是素因子i的倍数的数的数目减掉 i,2i,3i,···,(m/i)*i while(n%i==0) n/=i;//把该素因子全部约掉 printf("(%d:%d)",i,m); } } if(n>1) //还有一个比根号n大的素因子 ,也就是现在这个n m-=m/n; return m; } int main(){ int T; scanf("%d",&T); int N,M; while(T--){ scanf("%d%d",&N,&M); long long sum=0; for(int i=1;i*i<=N;i++){//只遍历到根号n,节省时间 if(N%i==0){ if(i>=M) sum+=Euler(N/i);//i为N的约数(1<=i<=根号n) if((N/i)!=i&&(N/i)>=M) sum+=Euler(i);//(N/i)是N的约数,(N/i)>=根号N printf("%d:%d\n",i,sum);} } printf("%lld\n",sum); } return 0; }