G - Happy 2004

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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
题意:
求2004的x次幂的因子和并对29取余。
题解:

6的因子是1,2,3,6; 6的因子和是 s(6)=1+2+3+6=12;

20的因子是1,2,4,5,10,20; 20的因子和是 s(20)=1+2+4+5+10+20=42;

2的因子是1,2; 2的因子和是 s(2)=1+2=3;

3的因子是1,3; 3的因子和是 s(3)=1+3=4;

4的因子和是 s(4)=1+2+4=7;

5的因子和是 s(5)=1+5=6;

s(6)=s(2)*s(3)=3*4=12;

s(20)=s(4)*s(5)=7*6=42;

这是巧合吗?

再看 s(50)= 1+2+5+10+25+50=93=3*31=s(2)*s(25),s(25)=1+5+25=31.

这在数论中叫积性函数,当gcd(a,b)=1时 s(a*b)=s(a)*s(b);

具体的证明过程请看我之前的博客:传送门

如果p是素数

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

计算 因子和 s(2004^X) mod 29 ,

2004=2^2 *3 *167

s(2004^X) ) = (s(2^2X))) * (s(3^X))) * (s(167^X)))

167)=22;

s(2004^X) ) = (s(2^2X))) * (s(3^X))) * (s(22^X)))

a=s(2^2X)=(2^(2X+1)-1) //根据 (1)

b=s(3^X)= (3^(X+1)-1)/2 //根据 (1)

c=s(22^X)= (22^(X+1)-1)/21 //根据 (1)

%运算法则 1. (a*b) %p= ( a%p) *(b%p)

%运算法则 2. (a/b) %p= ( a *b^(-1)%p)

b^(-1)是 b的逆元素 (%p)可以用扩展欧几里德逆元模板求

2的逆元素是15 ()) ,因为2*15=30 % 29=1 % 29

21的逆元素是18 ()) ,因为21*18=378% 29 =1 % 29

因此

a=(powi(2,2*x+1,29)-1)% 29;

b=(powi(3,x+1,29)-1)*15 % 29;

c=(powi(22,x+1,29)-1)*18 % 29;

ans=(a*b)% 29*c % 29;

#include <iostream>
using namespace std;
typedef long long ll;
const int mod=;
ll pow(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&)
ans=ans*a%mod;
b>>=;
a=a*a%mod;
}
return ans;
}
int main()
{
int x;
while(cin>>x&&x)
{
ll a=(pow(,*x+)-+mod)%mod;
ll b=(pow(,x+)-+mod)*%mod;
ll c=(pow(,x+)-+mod)*%mod;
ll ans=a*b*c%mod;
cout<<ans<<endl;
}
return ;
}

最新文章

  1. ACCP7.0-S2-复习自测-15测试分析
  2. jquery中使用event.target的几点
  3. Ruby零星笔记
  4. Javascript实现CheckBox的全选与取消全选的代码(转)
  5. result默认返回action中的所有数据,要想返回指定的数据怎么做呢
  6. [Android Pro] sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别
  7. App架构设计学习(一)---- 接口的设计
  8. C++11—lambda函数
  9. java strtus2 注解配置入门(一)
  10. Java 后台sql注入
  11. SQL Server触发器的禁用和启用
  12. BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]
  13. 2018年东北农业大学春季校赛-wyh的吃鸡
  14. 网络编程之非阻塞connect编写
  15. 【English】八、食物相关
  16. 多层json的构造,取值,还有使用bootstrap的tree view在前端展示的相关问题
  17. MySQL下载与安装
  18. vi/vim键盘对应图
  19. centos6.5下安装Nginx
  20. Java中的语法糖

热门文章

  1. Tomcat Can&#39;t load AMD 64-bit .dll on a IA 32
  2. 分享一段Java搞笑的代码注释
  3. CSS transition 过渡 详解
  4. 锋利的jQuery-4--给事件添加命名空间
  5. 史上最浅显易懂的Git分布式版本控制系统教程
  6. 导入安全证书到jdk步骤详细说明-原
  7. ASP.NET MVC中通过Request.IsAjaxRequest()来判断是否要加载公共视图
  8. jQuery1.11源码分析(10)-----Callbacks模块
  9. Windows环境下 Node和NPM个性安装
  10. C语言中的struct和typedef struct&lt;转载&gt;