POJ1845 因式分解短除法,快速幂取余,等比队列求和递归方法

该程序使用快速幂算法和等比数列求和递归方法解决POJ1845问题,首先求出a的约数和(质因数分解),然后乘以b的指数模运算结果,得到a的b次方的约数和。

JOP1845:参考文献,思路写的很清晰

思路:要想求a得b次方得约数,可以先求出来a得约数求和,(质因数),然后在a得指数上面乘上b,就可以求出来了

//POJ1845  因式分解短除法,快速幂取余,等比队列求和递归方法
#include<iostream>
using namespace std;
int const N = 1e6 + 10;
int moudle = 9901;
long long  a,b,x, ans=1;
int prime[N], cnt, exponent[N];
bool vis[N];
int  quick_power(int a, int b,int p) {//求a的b次时间复杂度logn
    long long  multiple = 1;//初始化在快速幂函数中防止每次求幂的值累加
    while (b) {
        //long long  multiple = 1;
        if (b & 1) {
            multiple =(long long ) multiple * a%p;
        }
        a = a * a %p;
        b = b / 2;
    }
    return multiple;
}

int sum(int q, int m) {//递归求等比数列
    if (m == 0) {
        return  1;
    }
    if (m & 1) {//表示m为奇数
        return  (1 + quick_power(q, (m + 1) / 2,moudle)) * (sum(q, (m - 1) / 2)%moudle);

    }
    else 
        return  (1 + quick_power(q, m / 2, moudle)) * (sum(q, m  / 2-1)%moudle)+quick_power(q,m,moudle);

}
int div(int n) {//分解质因数//效果就是统计n的质因数,以及指数
    for (int i = 2; i <= n / i; i++) {
        if (n % i == 0) {
            cnt++;
            prime[cnt] = i;
            while (n % i == 0) {
                n = n / i;
                exponent[cnt]++;
            }

        }
    }
    if (n > 1) {
        cnt++;
        prime[cnt] = n;
        exponent[cnt] = 1;
    }

    for (int i = 1; i <= cnt; i++) {//说明有n个质因数
        ans = (long long )ans%moudle * sum(prime[i], exponent[i] * b%moudle)%moudle;
    }
    cout << "质因数个数:" << cnt << endl;
    return ans;
}

int main() {
    cin >> a >> b;
    cout << div(a);
    return 0;

}

答案:

参考思路:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值