TJU Happy 2004
2013-10-07 20:12
127 查看
Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004X. 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 20041 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
Sample Output
题目大意:题目意思比较明白,不必多说。求约数的和,并将和模29输出。
解题分析:约数和 函数是积性函数,也就是说如果m,n互质,则
f(mn)=f(m)f(n);约数个数 函数也是积性函数。
如果p是素数 S(p^n)=1+p+p^2+...p^n=(p^(n+1)-1)/(p-1);所以本题
S(2004^x)=(2^(2*x+1)-1)(3^(x+1)-1)/2*(167^(x+1)-1)/166
由同余性质
若 a=b(mod m) 则 a^k=b^k (mod m),167%29=22%29,所以167可以用22代替。
源代码:
#include <iostream>
using namespace std;
int happy(int n)
{
int r,f,t,d;
f=t=d=1;
for (r=0;r<=n;++r)
{
f=f*(r==n?2:4)%29; //f表示2^(2n+1)的值
t=t*3%29; //t表示3^(n+1)的值
d=d*22%29; //d表示167^(n+1)的值
}
r=(f-1)*(t-1)*(d-1)%29; //S=r/332,r的值
return r*9%29; //S%29=r*9%29
}
int main()
{
int n;
while (cin>>n && n!=0)
{
cout<<happy(n%28)<<endl;
}
return 0;
}
这个题,我还没看太明白,主要是
欧拉定理,费马小定理 不熟悉。而且数论方面比较差,有待提高。
of S by 29).
Take X = 1 for an example. The positive integer divisors of 20041 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
题目大意:题目意思比较明白,不必多说。求约数的和,并将和模29输出。
解题分析:约数和 函数是积性函数,也就是说如果m,n互质,则
f(mn)=f(m)f(n);约数个数 函数也是积性函数。
如果p是素数 S(p^n)=1+p+p^2+...p^n=(p^(n+1)-1)/(p-1);所以本题
S(2004^x)=(2^(2*x+1)-1)(3^(x+1)-1)/2*(167^(x+1)-1)/166
由同余性质
若 a=b(mod m) 则 a^k=b^k (mod m),167%29=22%29,所以167可以用22代替。
源代码:
#include <iostream>
using namespace std;
int happy(int n)
{
int r,f,t,d;
f=t=d=1;
for (r=0;r<=n;++r)
{
f=f*(r==n?2:4)%29; //f表示2^(2n+1)的值
t=t*3%29; //t表示3^(n+1)的值
d=d*22%29; //d表示167^(n+1)的值
}
r=(f-1)*(t-1)*(d-1)%29; //S=r/332,r的值
return r*9%29; //S%29=r*9%29
}
int main()
{
int n;
while (cin>>n && n!=0)
{
cout<<happy(n%28)<<endl;
}
return 0;
}
这个题,我还没看太明白,主要是
欧拉定理,费马小定理 不熟悉。而且数论方面比较差,有待提高。
相关文章推荐
- 【bzoj1208】[HNOI2004]宠物收养所
- 【luogu2292】[HNOI2004]L语言
- bzoj 1367: [Baltic2004]sequence
- NOIP 2004 提高组 复赛 alpha 虫食算
- BZOJ 3365: [Usaco2004 Feb]Distance Statistics 路程统计 点分治
- luogu P2285 [HNOI2004]打鼹鼠
- BZOJ 1211 HNOI2004 树的计数 Prufer序列
- 求全排列的数学方法(洛谷1088 火星人noip2004普及组第4题)
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
- 1212: [HNOI2004]L语言
- HDU 1452 Happy 2004(约数和定理)
- bzoj1213 [HNOI2004]高精度开根
- bzoj 1212: [HNOI2004]L语言
- 二叉堆&优先队列-----noip2004 合并果子
- bzoj 2004: [Hnoi2010]Bus 公交线路
- bzoj3357 [Usaco2004]等差数列
- [HNOI2004]树的计数
- laplace_filter.c (@Copyright (C) 2004 University of Texas at Austin: 2-D Laplacian operator)
- [HNOI 2004]L语言
- 【数据结构】[NOIP2004]FBI树