POJ Sumdiv (数论+二分等比数列求和)

【题目链接】:click here~~

【题目大意】求


其中sum()表示其所有因子和(0=<A,B<=50000000)。

【思路】

二分等比数列求和,我们先把A的质因子分解出来,然后如下(poj讨论区的思路~~)

1+p+p^2+……+p^c=

1° odd(c)=true
 原式=cal(p,c)={p^[(c+1)>>1)] +1} *cal(p,(c-1)>>1);
2° odd(c)=false
 原式=cal(p,c)={p^[(c+1)>>1)] +1} *cal(p,(c-1)>>1) +p^c;

原理:例如c=3  分成(1+p)+(p^2+p^3)提出p^2,二分递归。
         c=4  分成(1+p)+(p^2+p^3)+(p^4),p^4单独计算。 

代码:

/*  
* Problem: POJ No.1845
* Running time: 16MS  
* Complier: G++  
* Author: javaherongwei 
* Create Time:  17:01 2015/9/22 星期二
*/  
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
typedef long long LL;

#define MODD(a,b) (((a%b)+b)%b)
const LL MOD=9901;
LL A,B;

LL poww(LL a,LL b){
    LL res=a,ans=1;
    while(b){
        if(b&1) ans=res*ans%MOD;
        res=res*res%MOD;
        b>>=1;
    }
    return  ans;
}

LL solve(LL A,LL B){ ///递归求解等比数列
    if(B==0)return 1;
    if(B&1){
        return (poww(A,((B+1)>>1))%MOD+1)*(solve(A,(B-1)>>1)%MOD);
    }
    if(B%2==0){
        return (poww(A,((B+1)>>1))%MOD+1)*(solve(A,(B-1)>>1)%MOD)+poww(A,B)%MOD;
    }
}

int main(){
    while(~scanf("%lld %lld",&A,&B)){
        LL ans=1,sum;
        for(int i=2; i*i<=A; ++i){
            if(A%i==0){
                sum=0;
                while(A%i==0){
                    sum++;
                    A/=i;
                }
                ans=ans*solve(i%MOD,B*sum)%MOD;
            }
        }
        if(A>=2) ans=ans*solve(A%MOD,B)%MOD;
        printf("%lld\n",ans%MOD);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值