ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《算法竞赛进阶指南》0x00 POJ1845 分治

2020-06-14 12:55:33  阅读:323  来源: 互联网

标签:进阶 int ll 0x00 long ans fj include POJ1845


题目链接:http://poj.org/problem?id=1958

求A的B次方的所有约数之和对9901的模。使用分治算法计算等比数列的前缀和,时间复杂度为O(logC)

代码如下:

#include<iostream>
#include<vector>
using namespace std;
#define ll long long 
#define maxn 1000
const ll p=9901;
int n;
ll ksm(ll a,ll b){//快速幂 
    ll ans=1;
    a%=p;
    while(b){
        if(b&1)ans=(ans*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return ans;
}
vector<pair<ll,ll>> w;
void fj(ll a){//分解质因数并且存在w中 ,a=p1^k1*p2^k2...ps^ks
    for(ll i=2;i*i<=a;i++){
        if(!(a%i)){
            ll num=0;
            while(!(a%i)){
                num++;
                a/=i;
            }
            w.push_back(make_pair(i,num)); 
        }
    }
    if(a!=1)w.push_back(make_pair(a,1));//大于根号a的质因数,最多只会有一个 
}
ll sum(ll a,ll c){//分治,计算1+a^1+a^2+...+a^c 
    if(!a)return 0;
    if(!c)return 1;
    if(c&1)return ( (1+ksm(a,(c+1)/2))*sum(a,c/2) )%p;
    return ( (1+ksm(a,c/2))*sum(a,c/2-1)+ksm(a,c) )%p; 
}
ll a,b;
int main(){
    cin>>a>>b;
    fj(a);//对a分解质因数
    ll ans=1;
    for(int i=0;i<w.size();i++){
        ll s=w[i].first;
        ll t=w[i].second;
        (ans*=sum(s,b*t))%=p;
    } 
    cout<<ans<<endl;
}

 

标签:进阶,int,ll,0x00,long,ans,fj,include,POJ1845
来源: https://www.cnblogs.com/randy-lo/p/13124406.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有