题目链接: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. 最牛逼的 Java 日志框架,性能无敌,横扫所有对手.....
  2. Spring多数据源配置和使用
  3. 吴渴楨 160809206
  4. 问号和星号 php,星号和问号两个通配符
  5. 基于 Jenkins 快速搭建持续集成环境
  6. 【学术相关】是什么让女性在计算机史上“隐身”了?
  7. 洛谷P1462-通往奥格玛瑞的路【日常图论,二分查找,最短路,SPAF】
  8. linux php c 扩展,linux下编写php5.6的C扩展模块(双向链表)
  9. 计算机网络作业第六章,计算机网络与通信第6章习题.doc
  10. C语言第五次作业--数据类型
  11. 暗中学习的人太坏了,12本书帮你翻车变超车!
  12. jQuery 文档碎片处理
  13. jdk帮助文档在哪_jdk帮助文档在哪里下载
  14. php 获取客户端的浏览器信息
  15. 扩展欧几里得模板+例题
  16. matlab匿名函数求导,MATLAB匿名函数和函数句柄
  17. android开发 自我优势_android开发简历自我评价怎么写
  18. dota2服务器选哪个文件,畅爽竞技必看 DOTA2服务器选择指南
  19. calculate函数使用方法c语言,使用 CALCULATE 函数
  20. Java并发编程:volatile关键字解析(学习总结-海子)

热门文章

  1. HTMLCSS仿京东注册页面制作静态页面总结
  2. python误差修正模型_误差修正模型ECM_eviews误差修正模型
  3. java spider爬虫_一个简单的java网络爬虫(spider)
  4. 聊聊flink的consecutive windowed operations 1
  5. STM32超低功耗入门之唤醒
  6. oracle启动实例界面,oracle 11g 启动数据库实例
  7. 【影评】摔跤吧爸爸!
  8. 远程桌面 android,Microsoft远程桌面
  9. 订单管理_03查询订单信息流程
  10. 【7gyy】高手分享辨别电脑病毒技巧