博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1845 (约数和+二分等比数列求和)
阅读量:6943 次
发布时间:2019-06-27

本文共 1951 字,大约阅读时间需要 6 分钟。

题目链接

题目大意:A^B的所有约数和,mod 9901.

解题思路

①整数唯一分解定理:

一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式。其中Pn为素数。

如2004=(22)*3*167。

那么2004x=(22x)*(3x)*(167x)。

②约数和公式

对于一个已经被分解的整数A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn),

有约数和S=(1+P12+P13+.....P1k1)*.....(1+Pn2+Pn3+.....Pnkn)。

(1+P12+P13+.....P1k1)是一个等比数列,化简为(P1k1+1 -1)/(P1-1),由于有除法同余式,很容易想到乘法逆元。

但是这题和HDU 1452不同,对于逆元表达式ax=1 mod n,乘法逆元存在的条件是gcd(a,n)=1,即a,n互质,但是这题的gcd(P1-1,9901)≠1, 所以不能用乘法逆元求解。

所以有必要对等比数列求和公式改一改:

(1)若n为奇数,一共有偶数项,则:

      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))

      = (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

上式红色加粗的前半部分恰好就是原式的一半,后半部分递归求解即可。

(2)若n为偶数,一共有奇数项,则:

      1 + p + p^2 + p^3 +...+ p^n

      = (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)

      = (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

这样,在对A质因数分解后,对于每一个质因数,累乘sum(质因数,次数)%mod即可,注意sum计算的时候都要mod防止溢出。

注意一下A的范围,A=0或A=1时无法分解质因数,所以特判结果分别是0和1。

 

#include "cstdio"#include "map"using namespace std;#define LL long long#define mod 9901map
prime_factor(LL n){ map
res; for(LL i=2;i*i<=n;i++) while(n%i==0) {++res[i];n/=i;} if(n!=1) res[n]=1; return res;}LL pow(LL a,LL n){ LL base=a,ret=1; while(n) { if(n&1) ret=(ret*base)%mod; base=(base*base)%mod; n>>=1; } return ret%mod;}LL sum(LL p,LL n){ if(n==0) return 1; if(n&1) return ((1+pow(p,(n>>1)+1))*sum(p,n>>1))%mod; else return ((1+pow(p,(n>>1)+1))*sum(p,(n-1)>>1)+pow(p,n>>1))%mod;}int main(){ //freopen("in.txt","r",stdin); LL a,b,res=1; scanf("%I64d%I64d",&a,&b); if(a==0) {printf("0\n");return 0;} map
fac=prime_factor(a); for(map
::iterator i=fac.begin();i!=fac.end();i++) { LL tmp=sum(i->first,i->second*b)%mod; res=(tmp*res)%mod; } printf("%I64d\n",res);}

 

13625416 Accepted 148K 0MS 992B 2014-11-13 12:53:25

转载地址:http://ksanl.baihongyu.com/

你可能感兴趣的文章
[ Talk is Cheap Show me the CODE ] : jQuery Mobile工具栏
查看>>
vc++加载透明png图片方法-GDI+和CImage两种
查看>>
【Unity技能】做一个简单的NPC
查看>>
基于System Generator实现Xilinx FPAG VGA显示
查看>>
CocoaPods 第三方库管理器
查看>>
SQLServer BCP 命令的使用
查看>>
在sd卡,创建目录和文件
查看>>
Discuz 楼主帖子采集
查看>>
十五天精通WCF——第十二天 说说wcf中的那几种序列化
查看>>
sqlldr并发
查看>>
C# 通过反射来动态创建泛型类型
查看>>
zabbix 的安装
查看>>
C# inline-hook / api-hook
查看>>
BZOJ 3505 CQOI 2014 数三角形 数学
查看>>
Android 基于Message的进程间通信 Messenger完全解析
查看>>
LinuxThreads 和 NPTL
查看>>
你把它列入博客设置?
查看>>
防止网页被搜索引擎爬虫和网页采集器收录的方法汇总
查看>>
rpm安装FAQ
查看>>
VMware网络连接失败
查看>>