38 lines
749 B
C++
38 lines
749 B
C++
|
||
#include<cstdio>
|
||
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;
|
||
}
|
||
|