唯一分解定理

一个大于1的正整数肯定能被分成一系列素数的和,因为合数可以由素数相乘得到。 所以 n=p1^a1 * p2^a2 . . .*pn^an(pi 为素数)。

经过思考可以得出
1.求n的因数的个数。
(1+a1)(1+a2)(1+a3)(1+a4)…(1+an)(ai 为素因数的幂);
p1^a1是n的因数,那么p1 ^(0~a1)都是n的因数,相乘求出所以可能。
(大概是这样吧。。。)

2.求n的因数之和
sum=(q1^ 0+q1^ 1+q1^ 2…q1^ a1)(q2^ 0+q2^ 1+q2^ 2…q2^ a2)…*(qn^ 0+qn^ n+qn^ 2 …qn^ an);

总结:
一开始以为这个定理没啥用(还是太弱了qaq),我以为按暴力的方法是√n的复杂的,这个唯一分解定理最短应该也是个O(n),开始以为自己的方法很完美,结果。。。。

求因子个数代码如下

while(~scanf("%lld",&a))
    {
        ll ans =0;
        for(int i=1;i*i<=a;i++)
        {
            if(a%i==0)
            {
                if(i!=a/i)
                    ans +=i+a/i; //知道一个因数用n除这个因数即可得到另一个因数,n =√n*√n,遍历这一半即可得到另一半不会遗漏。
                else
                    ans +=i;
                ans %=mod;
            }
        }
        printf("%lld\n",ans%mod);
    }

当我遇到这题的时候突然明白了唯一分解定理的用处。
POJ - 1845 G - Sumdiv。问题链接

a^b次方太大,我们无法直接求出n,如果在求a ^b次方的过程中取模,会有精度损失,如果用唯一分解定理分解就不会有这种问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值