Hdu2558(欧拉函数)

/*

欧拉函数ψ(N)=N{∏p|N}(1-1/p)亦即:ψ(N)=(P是数N的质因数)如:

ψ(10)=10×(1-1/2)×(1-1/5)=4

ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8

ψ(49)=49×(1-1/7)==42

*/

 

#include<iostream>

#include<cmath>

using namespace std;

 

int euler(int n){             //欧拉函数

       int ans = n;

       int s = sqrt((double)n);

       for(int i=2;i<=s; i++){

              if(n % i == 0){

                     ans = ans / i * (i - 1);

                  while(n % i == 0)

                            n /= i;

              }

       }

       if(n > 1)

              ans = ans / n * (n - 1);

       return ans;

}

 

/*

设a为大于等于m的n的一个约数,那么euler(n/a)表示的

就是所有小于a与a互质的数的个数,设任一个数为x,那

么这些数再乘以a就有gcd(n,x*a) = a;所以答案为所有n

的约数ai大于等于m的值的euler(n/ai)之和

*/

 

int main(){

       int t;

       cin>>t;

       while(t--){

              int n, m;

              cin>>n>>m;

              if(m == 1){

                     cout<<n<<endl;

                     continue;

              }

              int ans = 0;

              int s = sqrt((double)n);

              for(int i=1; i<=s; i++){

                     if(n % i == 0){

                            if(i >= m)

                                   ans += euler(n / i);

                            if(n / i >= m)

                                   ans += euler(i);

                     }

              }

              if(n > 1 && s * s == n && s >= m)

                     ans -= euler(s);

              cout<<ans<<endl;

       }

       return 0;

}