poj 1845 Sumdiv (等比求和+逆元)
题目链接: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 (等比求和+逆元)相关推荐
- POJ 1845 Sumdiv 【逆元】
题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和 用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...
- c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...
- poj 1845 Sumdiv (算数基本定理+逆元)
输入a和b,求a^b的所有因子之和. #include <iostream> #define ll long longusing namespace std;const int mod=9 ...
- Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)
题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...
- Sumdiv POJ - 1845
Sumdiv POJ - 1845 题意: 求ABA^BAB的所有约数之和mod 9901(1<=A,B<=5e7) 题解: 我们先将A分解质因子,表示为:p1c1∗p2c2∗...... ...
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)
[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分 整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...
- 【简●解】POJ 1845 【Sumdiv】
POJ 1845 [Sumdiv] [题目大意] 给定\(A\)和\(B\),求\(A^B\)的所有约数之和,对\(9901\)取模. (对于全部数据,\(0<= A <= B <= ...
- POJ 1845 逆元 / 分治
题意 传送门 POJ 1845 题解 分解质因数 A=p1e1p2e2-pnenA=p_1^{e_1}p_2^{e_2}\dots p_n^{e_n}A=p1e1p2e2-pnen,则约数 ...
- POJ NOI MATH-7829 神奇序列求和
问题链接:POJ NOI MATH-7829 神奇序列求和. 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个序列,初始时只有两个数x和y,之后每次操作时,在原序列的任意两个相邻数 ...
- POJ 1845 【数论】
题目链接:POJ 1845 题意 求ababa^b的所有约数之和,最终结果对9901求模 需要知识 1.快速幂:二分法求nmnmn^m的结果 2.因数分解:遍历求出所有因数 3.约数和定理:假设n=p ...
最新文章
- 最牛逼的 Java 日志框架,性能无敌,横扫所有对手.....
- Spring多数据源配置和使用
- 吴渴楨 160809206
- 问号和星号 php,星号和问号两个通配符
- 基于 Jenkins 快速搭建持续集成环境
- 【学术相关】是什么让女性在计算机史上“隐身”了?
- 洛谷P1462-通往奥格玛瑞的路【日常图论,二分查找,最短路,SPAF】
- linux php c 扩展,linux下编写php5.6的C扩展模块(双向链表)
- 计算机网络作业第六章,计算机网络与通信第6章习题.doc
- C语言第五次作业--数据类型
- 暗中学习的人太坏了,12本书帮你翻车变超车!
- jQuery 文档碎片处理
- jdk帮助文档在哪_jdk帮助文档在哪里下载
- php 获取客户端的浏览器信息
- 扩展欧几里得模板+例题
- matlab匿名函数求导,MATLAB匿名函数和函数句柄
- android开发 自我优势_android开发简历自我评价怎么写
- dota2服务器选哪个文件,畅爽竞技必看 DOTA2服务器选择指南
- calculate函数使用方法c语言,使用 CALCULATE 函数
- Java并发编程:volatile关键字解析(学习总结-海子)
热门文章
- HTMLCSS仿京东注册页面制作静态页面总结
- python误差修正模型_误差修正模型ECM_eviews误差修正模型
- java spider爬虫_一个简单的java网络爬虫(spider)
- 聊聊flink的consecutive windowed operations 1
- STM32超低功耗入门之唤醒
- oracle启动实例界面,oracle 11g 启动数据库实例
- 【影评】摔跤吧爸爸!
- 远程桌面 android,Microsoft远程桌面
- 订单管理_03查询订单信息流程
- 【7gyy】高手分享辨别电脑病毒技巧