1452 Happy 2004 (所有因子求和)

Happy 2004

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 837    Accepted Submission(s): 586

Problem Description
Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29).
Take X = 1 for an example. The positive integer divisors of 2004^1 are 1, 2, 3, 4, 6, 12, 167, 334, 501, 668, 1002 and 2004. Therefore S = 4704 and S modulo 29 is equal to 6.
 
Input
The input consists of several test cases. Each test case contains a line with the integer X (1 <= X <= 10000000).
A test case of X = 0 indicates the end of input, and should not be processed.
 
Output
For each test case, in a separate line, please output the result of S modulo 29.
 
Sample Input
  
  
1 10000 0
Sample Output
  
  
6 10
 
思路分析:

设S(x)表示x的因子和。则题目求为:S(2004^X)mod 29 因子和S是积性函数,即满足性质1。

性质1 :如果 gcd(a,b)=1 则 S(a*b)= S(a)*S(b) 2004^X=4^X * 3^X *167^X S(2004^X)=S(2^(2X)) * S(3^X) * S(167^X)

性质2 :如果 p 是素数 则 S(p^X)=1+p+p^2+...+p^X = (p^(X+1)-1)/(p-1) 因此:S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (167^(X+1)-1)/166 167%29 == 22 S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (22^(X+1)-1)/21

性质3 :(a*b)/c %M= a%M * b%M * inv(c) 其中inv(c)即满足 (c*inv(c))%M=1的最小整数,这里M=29 则inv(1)=1,inv(2)=15,inv(22)=15

有上得: S(2004^X)=(2^(2X+1)-1) * (3^(X+1)-1)/2 * (22^(X+1)-1)/21 =(2^(2X+1)-1) * (3^(X+1)-1)*15 * (22^(X+1)-1)*18

快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c 
 
 
代码
  1. #include<iostream>   
  2. using namespace std;  
  3. const int pow[][3]={{2,5,32},{3,4,81},{22,2,484}};  
  4. //2^5>29,3^4>29,22^2>29,用于求(b^i)%29   
  5. int PowMod29(int x,int index)   //快速模幂   
  6. {  
  7.     int ans=1;  
  8.     while(index>=pow[x][1]) //当指数大于这个值将会超过29   
  9.     {  
  10.         ans=(ans*pow[x][2])%29;  //所以要模29.并且要乘上前面的值!   
  11.         index-=pow[x][1];  
  12.     }  
  13.     while(index--) ans=(ans*pow[x][0])%29;//把剩余的不超过29的乘上!再记得模上29(因为有可能超过29)   
  14.     return ans;  
  15. }  
  16. int main()  
  17. {  
  18.     int X,part2,part3,part167;  
  19.     while(cin>>X&&X!=0)  
  20.     {  
  21.         part2=PowMod29(0,2*X+1);  
  22.         part3=PowMod29(1,X+1);  
  23.         part167=PowMod29(2,X+1);  
  24.         cout<<((part2-1)*(part3-1)*15*(part167-1)*18)%29<<endl;//再模29,因为有超过29的可能.   
  25.     }  
  26.     return 0;  
  27.  
 
 
 
 
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值