HDU4497——GCD and LCM

这个题目挺不错的,看到是通化邀请赛的题目,是一个很综合的数论题目。

是这样的,给你三个数的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 }
如有转载,请注明出处(http://www.cnblogs.com/lochan)
原文地址:https://www.cnblogs.com/lochan/p/3355679.html