• 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)
  • 相关阅读:
    头脑王者 艺术,电影,体育,时尚,动漫
    头脑王者 音乐
    头脑王者 地理
    头脑王者 历史,军事
    头脑王者 文学
    Jenkins project
    sql server drop login failed
    devenv.exe 编译Solution
    Jenkins
    头脑王者
  • 原文地址:https://www.cnblogs.com/lochan/p/3355679.html
Copyright © 2020-2023  润新知