这个题目挺不错的,看到是通化邀请赛的题目,是一个很综合的数论题目。
是这样的,给你三个数的GCD和LCM,现在要你求出这三个数有多少种可能的情况。
对于是否存在这个问题,直接看 LCM%GCD是否为0,如果不为0的话,就没有满足条件的数哦,反之一定有。
接下来问题等价于求三个数GCD为1,LCM为LCM/GCD的种类数了。
设这个商为X。 首先我们可以把X因数分解成X=(p1*x1)*(p2*x2)*……*(pn*xn);
单独拿出一个素数进行讨论,如果要设ABC分别为满足情况的三个数,那么Xa1,Xa2,Xa3中间必定有一个数为0,否则GCD就不为1了,同时必定有一个最大的为x1
这样我们可以得出三大种类可能的情况,分别问(x1,0,0 ),(x1,x1,0)和(x1,(1-x1-1)之间,0)
这三个可能的情况分别为3,3,6* (x1-1),注意第二和第三种情况不能合并,想想为什么?因为相同的元素的个数不同,排列也不同。
这样我们就知道对于单个分解出来的因子对于种类数的贡献值为6*xi,由于每个因子之间是互不影响的,所以用的是乘法原理。
其他的就没什么了,可以迅速A掉。
另外说明一下:本题的数据太水了,理论上说我这种求质因子的方法是会超时的。想想为什么?
1 #include <cstdio> 2 using namespace std; 3 4 void out(int x) 5 { 6 int ans=1,tep; 7 for (int i=2; i<=x; i++) 8 { 9 if (x%i>0) continue; 10 tep=0; 11 while (x%i==0) tep++,x/=i; 12 ans*=6*tep; 13 } 14 printf("%d ",ans); 15 } 16 17 int main() 18 { 19 int t,G,L; 20 scanf("%d",&t); 21 while (t--) 22 { 23 scanf("%d%d",&G,&L); 24 if (!(L%G)) out(L/G); else printf("0 "); 25 } 26 return 0; 27 }