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 ...
最新文章
- linux练习手册,Linux操作习题集(1)
- USACO-Section1.4 Prime Cryptarithm (搜索)
- 解封装(八):av_seek_frame改变播放进度函数
- 数据结构c java_Java - 数据结构
- java里pom.xml是啥意思_maven中pom.xml详细介绍
- QuickHit游戏
- Python:安装pip
- lnmp 一键安装
- java下载文件到本地
- 安装杀毒软件是保障计算机安全,电脑安全都需要哪些杀毒软件
- 二元二次方程例题_二元二次方程组练习题及答案.doc
- QQ通信原理及QQ是怎么穿透内网进行通信的?
- 支配树(Dominator Tree)
- 错误:There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate
- 收藏不迷路 —— Flutter 转场动效大合集
- 亿欧智库发布最新研究报告 阿里云数据中台成中国乳企数字化首选方案
- Sublime text 3 注册码(转自晚晴幽草(简书作者))
- maven打包报内存不足,配置maven vm options
- squid回源延迟读
- 小程序Cannot read property 'elem' of undefined
热门文章
- Neural Machine Translation by Jointly Learning to Align and Translate论文及代码助解
- 答疑解惑 | 关于PMBOK第七版,常见问题合集【附电子版】
- L1-009 N个数求和(包含样例分析)
- 我只想保持本色,和少年的心气。
- At least one JAR was scanned for TLDs yet contained no TLDs.问题解决方式
- 从bam中截取指定位置的 reads 或深度
- ORACLE介质管理库MML
- 半孔板设计需要注意细节问题
- Markdown 简单美化
- oracle hint firstrow,stored outlines迁移成SQL执行计划基线