http://acm.hdu.edu.cn/showproblem.php?pid=4497
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65535/65535 K (Java/Others)
2 6 72 7 33
72 0
部分思路来自之前的一道题(UVa 10892题解)。
解释下这里的6是怎么来的:
设L/G=(p1^r1)*(p2^r2)*(p3^r3)…(pm^rm)
又设
x=(p1^i1)*(p2^i2)*(p3^i3)…(pm^im)
y=(p1^j1)*(p2^j2)*(p3^j3)…(pm^jm)
z=(p1^k1)*(p2^k2)*(p3^k3)…(pm^km)
对于某个r,i、j、k里面一定有一个是r,并且一定有一个是0,所以i,j,k有一下3种情况:
r 0 0 ,有C(3,1)种
r 0 r ,有C(3,1)种
r 0 1~r-1 ,有(r-1)*A(3,3)种
所以一共是6*r种。
完整代码:
/*15ms,200KB*/ #include<cstdio> int main() { int t; long long m, n, ans, i, count; scanf("%d", &t); while (t--) { scanf("%I64d%I64d", &m, &n); if (n % m) puts("0");///注意特判 else { n /= m; ans = 1; for (i = 2; i * i <= n; i += 2)///不用求素数,因为范围很小(注意n在不断减小) { if (n % i == 0) { count = 0; while (n % i == 0) { n /= i; ++count; } ans *= 6 * count; } if (i == 2) --i;///小技巧 } if (n > 1) ans *= 6; printf("%I64d\n", ans); } } return 0; }