POj-1845 Sumdiv-快速幂取模+质因数分解

问题描述:
AB的所有因数之和mod9901,1A,B5107
AC代码:

int p[10010];//质因数
long long e[10010];//对应的指数
int decomposition(int n)//对n分解质因数
{
    int id = 1;
    for(int i = 2; i <= (int)sqrt((double)n); ++i)
    {
        if(n % i == 0)
        {
            p[id] = i;
            while(n % i == 0)
            {
                n /= i;
                e[id]++;
            }
            id++;
        }
    }
    if(n != 1)//特判n为质数的情况
    {
        p[id] = n;
        e[id] = 1;
        id++;
    }
    return id - 1;//返回质因数的个数
}
long long quick_power(long long a,long long b)//开long long损失不了什么,但自信地开int会WA地怀疑人生
{
    long long ans = 1;
    while(b > 0)
    {
        if(b % 2 == 1)
            ans = (ans * a) % 9901;
        b = b / 2;
        a = (a * a) % 9901;
    }
    return ans;
}
long long sum(long long p,long long c)
{
    if(c == 0)
        return 1;
    if(c % 2 == 1)
        return (1 + quick_power(p,(c + 1) / 2)) * sum(p,(c - 1) / 2) % 9901;
    else
        return ((1 + quick_power(p,c / 2)) * sum(p,c / 2 - 1) + quick_power(p,c)) % 9901;
}
int main()
{
    int a,b;
    while(cin >> a >> b)
    {
        int n = decomposition(a);//对a进行质因数分解,n为质因数的个数
        long long ans = 1;//答案
        for(int i = 1; i <= n; ++i)
            ans = (ans * sum(p[i],e[i] * b)) % 9901;
        cout << ans % 9901 << endl;
    }
    return 0;
}

解决方法:
要求AB所有质因数之和,首先要对AB进行质因数分解,可是AB非常地大,根本无法直接计算
那只能先对A或对B进行质因数分解了
如果对B进行质因数分解的话,无法解决问题
如果对A进行质因数分解A=pc11pc22pcnn的话
AB可以表示为A=pc1B1pc2B2pcnBn,可以说是比较成功地完成了质因数分解
想要计算所有因数的和,首先还是要计算出所有的因数,在这里可以运用组合数学的知识,借鉴因数个数定理,求出所有的因数的和。
对于每一个质因数,我们可以选择将它不加入因数中,也可以将它的一次幂、二次幂、直到ciB次幂加入因数中
所以所有因数之和为(1+p1+p21++pc1B1)(1+p2+p22++pc2B2)(1+pn+p2n++pcnBn)
每个括号内的形式都是相似的,可以归结成求sum(p,c)=1+p+p2++pc的问题,这是一个等比数列,可以用求和公式来计算,但是公式中有除法,而我们还要取模,这可以用逆元来解决,不过这里我们用分治的方法优雅地处理
当c为奇数时,
sum(p,c)=(1+p++pc12)+(pc+12++pc)
=(1+p++pc12)+pc+12(1+p++pc12)
=(1+pc+12)sum(p,c12)
当c为偶数时,类似地有
sum(p,c)=(1+pc2)sum(p,c21)+pc
在求解乘方时,使用快速幂来优化

阅读更多
版权声明:欢迎转载 https://blog.csdn.net/suntengnb/article/details/79960776
个人分类: 分治 数学
上一篇贪心中的区间问题
下一篇POj-1958 Strange Towers of Hanoi-递推
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭