又是欧拉定理的运用...
先找出N的约数x,并且gcd(x,N)>= M,结果为所有N/x的欧拉函数之和。
因为x是N的约数,所以gcd(x,N)=x >= M;
设y=N/x,y的欧拉函数为小于y且与y互质的数的个数。
设与y互质的的数为p1,p2,p3,…,p4
那么gcd(x* pi,N)= x >= M。
也就是说只要找出所有符合要求的y的欧拉函数之和就是答案了。
代码如下:
m == 1的情况也要考虑到
#include <math.h>
#include <stdio.h>
int euler_phi(int n) {
int m = (int)sqrt(n+0.5);
int i, ans = n;
for(i=2; i<=m; ++i) {
if(n%i == 0) {
ans = ans/i*(i-1);
n /= i;
while(n%i == 0)
n /= i;
}
}
if(n > 1)
ans =ans/n*(n-1);
return ans;
}
int f(int n, int m) {
int tmp = (int)sqrt(n+0.5);
int i, ans = 0;
for(i=1; i<=tmp; ++i) {
if(n%i == 0) {
if(i >= m) {
ans += euler_phi(n/i);
}
if(i!=n/i && n/i>=m) {
ans += euler_phi(i);
}
}
}
return ans;
}
int main(void) {
int T, n, m, ans;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
ans = f(n, m);
printf("%d\n", ans);
}
return 0;
}