hdu4497 (唯一分解定理)

题面如下:

http://acm.hdu.edu.cn/showproblem.php?pid=4497

本题开始是准备暴力一波的,三层for循环直接判断。但是试了下,那些边角重叠没法处理(菜是真理),所以觉得应该不是这个做法。

所以去搜了下Blog,发现是个没见过的点。唯一分解定理。。由于是数论专题内的,所以就去专门研究了下。

大致就是所有的大于等于2的数都可以分解为素数的乘积,然后如果这个数本就是个素数,那么它就等于它本身。

如 8 = 2*2*2, 而7 = 7;

但是定理是这么个理,但对于具体题目的应用肯定有不同了。

 

这题的本身是说在输入的两个值ingcd和inlcm中,有多少组三个数的gcd与lcm与输入的ingcd和inlcm相同

其中pn是素数集合,n是素数在素数表中的位置

所以三个数可以分解如下

x = p1^a1*p2^a2*...*pn^an

y = p1^b1*p2^b2*...*pn^bn

z = p1^c1*p2^c2*...*pn^cn

所以x'=x/gcd,y'=y/gcd,z'=z/gcd三个数的  gcd为1,lcm'为inlcm/ingcd

所以可以得到

lcm' = p1^r1*p2^r2*...*pn^rn

 

x' = p1^i1*p2^i2*...*pn^in

y' = p1^j1*p2^j2*...*pn^jn

z' = p1^k1*p2^k2*...*pn^kn

 

这其中我们可以知道每组(in, jn, kn)中一定有一个等于0,也一定有一个是rn,我们姑且记为rn = max(in, jn, kn)

对于上面这句话可以这么理解,如果没有等于0的,那么所有分解的数次方都是1,那么gcd'就不会是1了

同样,如果没有等于rn的,那么最小公倍数就会小于lcm'了

 

所以我们可以得知

对于每组有三种组合可能

1.     0 0 maxijk  C(1,3) = 3

2.     0 maxijk maxijk  C(1,3) = 3

3.     0 0~maxijk-1 maxijk  A(3, 3) = 6

所以每共有3+3+6*(maxijk-1) = 6*maxijk个

 

那么如果每次可以从最小公倍数中分解出来一个素数,这时候就可以新组成一个组合。

(其实还不是特别理解,希望岁月能让我明白然后回来更新吧。)

ps:睡觉的时候突然明白了,不过确实对我这种菜鸡来说很难想到

我们开始算的是每个素数的次方,即如果是ingcd=6和inlcm=72,那么就是lcm'=12

它就可以分解为12 = 2^2*3^1

那么就是6*2*6*1=72

那么就可以得出结论了,先求出每个素数的内部组合情况,然后再将所有情况相乘即可

这位大佬解释地更详细→传送门:https://blog.csdn.net/synapse7/article/details/13009253

 

贴个代码

#include<stdio.h>
int main()
{
    int t;
    long long i, gcd, lcm, count, ans;
    scanf("%d", &t);
    while(t--){
        scanf("%lld %lld", &gcd, &lcm);
        if(lcm%gcd){printf("0\n"); continue;}
        lcm=lcm/gcd;
        ans=1;
        for(i=2; i*i<=lcm; i++){
            if(lcm%i==0){
                count=0;
                while(lcm%i==0){
                    count++;
                    lcm=lcm/i;
                }
                ans=ans*6*count;
            }
        }
        if(lcm>1)
            ans = ans*6;
        printf("%lld\n", ans);
    }
    return 0;
}

上面也可以像大佬写的那样,i=2处理后--i,然后i+=2,可以省一半时间吧。

 

还有一个细节,就是这么做很可能TLE,所以我们为了降低时间可以将判断范围在sqrt内。

那么这么做就可能陷入最后可能只剩一个素数,但是它的组合没有被算进去(因为范围超了,如14 = 2*7, 处理2后i = 3,i*i=9超了后来的lcm=7),所以这一个素数自己就有0 0 maxijk 和0 maxijk maxijk两种情况的总和,即6。

当然了,如果很难理解也可以就把范围限制在lcm。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值