题目:A,B是两个自然数,已知限制如下:A,B的最大公约数为1,最小公倍数为A * B。
假设一个自然数N是两个自然数AB的最小公倍数,给出N 的值,满足上述条件的数对A和B有多少对?例如,如果N = 30,则有四对可能的自然数(1,30)(2,15)(3,10)(5,6),编写一个程序,给定一个自然数N,输出满足上述条件的情况数有多少?
输入描述:
第一行给出一个自然数T,表示测试用例的数量。接下来T行测试用例,每行给出一个自然数N。
1<=T<=1000,? 1<=K<=100?000 000,?
输出描述:
按顺序输出每个测试用例的答案,对于每个测试用例,输出以N为最小公倍数的自然数对的数量
例:
输入:
1
30
输出:
4
C程序代码:
/*函数功能:判断2个数能否成为AB。 ?*/ int Can_ab(int a, int b) { ? ? int m = a * b; ? ? int c = a % b; ? ? while(c) { ? ? ? ? a = b; ? ? ? ? b = c; ? ? ? ? c = a % b; ? ? } ? ? if(b == 1 && m / b == a * b) ? ? ? ? return 1; ? ? return 0; } int Number_AB(int n) { ? ? int i = 1, j = n, ret = 0; ? ? for(i = 1; i < j; ++i){ ? ? ? ? j = n / i; ? ? ? ? if(n % i == 0 && Can_ab(i, j) == 1) ? ? ? ? ? ? ++ret; ? ? } ? ? return ret; } int main() { ? ? int n; ? ? scanf("%d", &n); ? ? int a[n][2]; ? ? for(int i = 0; i < n; ++i){ ? ? ? ? scanf("%d", &a[i][0]); ? ? ? ? a[i][1] = Number_AB(a[i][0]); ? ? } ? ? for(int i = 0; i < n; ++i){ ? ? ? ? printf("%d", a[i][1]); ? ? } ? ? return 0; } ?
|