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

题目大意:给出两个自然数a,b,求a^b的所有自然数因子的和模上9901 (0 <= a,b <= 50000000)

解题思路:我们先利用唯一分解定理,将a分解成(p1^q1)*(p2^q2)……(pk^qk)的形式,则a^b=((p1^q1)*(p2^q2)……(pk^qk))^b=(p1^q1b)*(p2^q2b)……(pk^qkb)

a^b的因子和就会等于(1+p1+p1^2+……p1^q1b)*(1+p2+p2^2+……p2^q2b)*……(1+pk+pk^2+……pk^qkb)

然后我们可以用等差求和公式转化为((p1^(q1b+1)-1)/(p1-1))*((p2^(q2b+1)-1)/(p2-1))……((pk^(qkb+1)-1)/(pk-1))

对于求逆元:

(a/b)%mod=(a%(mod*b))/b%mod。对B*mod取余,剩余的值必定是B的倍数,这种方法是用于mod和B小的时候,用在这题就刚好了。

#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=500005;
const int mod=9901;
ll a,b,prime[MAXN],tot;
void getPrime(int N){  //筛素数 for(int i=1;i<=N;i++) prime[i]=1;for(int i=2;i<=N;i++){if(prime[i])prime[tot++]=i;for(int j=0;j<tot&&prime[j]*i<=N;j++){prime[i*prime[j]]=0;if(i%prime[j]==0)break;}}
}
ll qmul(ll a,ll b,ll m){ll res=0;while(b){if(b&1) res=(res+a)%m;b>>=1;a=(a+a)%m;}return res;
}
ll qpow(ll a,ll b,ll m){ll res=1;while(b){if(b&1) res=qmul(res,a,m);  //直接相乘会爆,可以一个一个加 a=qmul(a,a,m);b>>=1;}return res;
}
ll solve(ll x,ll y){ll ans=1;for(int i=0;prime[i]*prime[i]<=x;i++){if(x%prime[i]==0){int cnt=0;while(x%prime[i]==0){cnt++;x/=prime[i];}ll M=(prime[i]-1)*mod;ans=ans*(qpow(prime[i],cnt*y+1,M)-1+M)%M/(prime[i]-1)%mod;}}if(x>1){ll M=(x-1)*mod;ans=ans*(qpow(x,y+1,M)-1+M)%M/(x-1)%mod;}return ans;
}
int main(){cin>>a>>b;getPrime(500000);cout<<solve(a,b)<<endl;return 0;
}

转载于:https://www.cnblogs.com/zjl192628928/p/10816112.html

poj 1845 Sumdiv (等比求和+逆元)相关推荐

  1. POJ 1845 Sumdiv 【逆元】

    题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和  用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...

  2. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...

  3. poj 1845 Sumdiv (算数基本定理+逆元)

    输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...

  4. Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

    题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...

  5. Sumdiv POJ - 1845

    Sumdiv POJ - 1845 题意: 求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7) 题解: 我们先将A分解质因子,表示为:p1c1∗p2c2∗...... ...

  6. 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

    [POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...

  7. 【简●解】POJ 1845 【Sumdiv】

    POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...

  8. POJ 1845 逆元 / 分治

    题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1​​p2e2​​-pnen​​,则约数 ...

  9. POJ NOI MATH-7829 神奇序列求和

    问题链接:POJ NOI MATH-7829 神奇序列求和. 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个序列,初始时只有两个数x和y,之后每次操作时,在原序列的任意两个相邻数 ...

  10. POJ 1845 【数论】

    题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...

最新文章

  1. linux练习手册,Linux操作习题集(1)
  2. USACO-Section1.4 Prime Cryptarithm (搜索)
  3. 解封装(八):av_seek_frame改变播放进度函数
  4. 数据结构c java_Java - 数据结构
  5. java里pom.xml是啥意思_maven中pom.xml详细介绍
  6. QuickHit游戏
  7. Python:安装pip
  8. lnmp 一键安装
  9. java下载文件到本地
  10. 安装杀毒软件是保障计算机安全,电脑安全都需要哪些杀毒软件
  11. 二元二次方程例题_二元二次方程组练习题及答案.doc
  12. QQ通信原理及QQ是怎么穿透内网进行通信的?
  13. 支配树(Dominator Tree)
  14. 错误:There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate
  15. 收藏不迷路 —— Flutter 转场动效大合集
  16. 亿欧智库发布最新研究报告 阿里云数据中台成中国乳企数字化首选方案
  17. Sublime text 3 注册码(转自晚晴幽草(简书作者))
  18. maven打包报内存不足,配置maven vm options
  19. squid回源延迟读
  20. 小程序Cannot read property 'elem' of undefined

热门文章

  1. Neural Machine Translation by Jointly Learning to Align and Translate论文及代码助解
  2. 答疑解惑 | 关于PMBOK第七版,常见问题合集【附电子版】
  3. L1-009 N个数求和(包含样例分析)
  4. 我只想保持本色,和少年的心气。
  5. At least one JAR was scanned for TLDs yet contained no TLDs.问题解决方式
  6. 从bam中截取指定位置的 reads 或深度
  7. ORACLE介质管理库MML
  8. 半孔板设计需要注意细节问题
  9. Markdown 简单美化
  10. oracle hint firstrow,stored outlines迁移成SQL执行计划基线