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

12人阅读 评论(0) 收藏 举报
分类:

问题描述:
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
在求解乘方时,使用快速幂来优化

查看评论

快速幂取模 c/c++

  • 2009年08月07日 10:30
  • 688B
  • 下载

快速幂取模(分治思想)

快速幂取模 许多时候我们需要计算a^b %c 如是的式子。 一、像下面这样直接来求 int res = 1; for(int i = 1;i...
  • Feynman1999
  • Feynman1999
  • 2017-03-01 17:04:28
  • 274

ACM算法:快速幂取模(详细)

快速幂取模的思路:快速幂实现的最基本的理论就是我们离散课上或者数论中学过的一条公式推出的引理。 引理:积的取余等于取余的积的取余。 再在这条引理的基础之上,对指数型数据进行拆分以及合.........
  • DBC_121
  • DBC_121
  • 2017-08-28 12:23:21
  • 426

快速幂取模法

代码详解 long long quickmod(long long a,long long b,long long m) { long long ans = 1; while(b)/...
  • qq_25605637
  • qq_25605637
  • 2015-08-08 12:04:39
  • 311

NOIP2012普及组-质因数分解

题目描述:点击打开链接 /* 思路:判断i是否为n的因子,是在判断i和n/i是否为质数 */ #include int Is_Prime(int n); int main(voi...
  • Folen_
  • Folen_
  • 2017-08-14 19:47:24
  • 333

快速幂 && 快速幂 取模

快速幂 && 快速幂 取模
  • shouwang_tomorrow
  • shouwang_tomorrow
  • 2015-08-18 17:49:36
  • 238

noip2012 质因数分解 (枚举)

P2067 [NOIP2012P1]质因数分解 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2012 描述...
  • yuyanggo
  • yuyanggo
  • 2015-10-02 14:32:39
  • 1462

43:质因数分解

原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。 输入输入只有一行,包含一个正整数...
  • mayuan2017
  • mayuan2017
  • 2017-09-10 13:13:43
  • 607

POJ NOI0105-43 质因数分解

问题链接:POJ NOI0105-43 质因数分解。 总时间限制:1000ms内存限制: 65536kB 描述  已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。输入...
  • tigerisland45
  • tigerisland45
  • 2017-05-11 10:10:22
  • 977

数据结构与算法学习-快速幂取模

当我们遇到类似于求a*b%c这样的问题的时候,如果是a^b%c,当a^b这个数特别大的时候,以至于int范围存不下该值,那最后取模得到的值当然也是错的,这个时候就运用到快速幂取模算法,这种算法的时间复...
  • Move_now
  • Move_now
  • 2016-10-09 11:17:11
  • 549
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 2341
    排名: 1万+
    最新评论