hdoj 1452 Happy 2004 所有因子求和
2012-03-24 17:54
302 查看
思路: 任意一个大于2的数都可以写成素因子乘积的形式,对于2004 = 2*2*3*167;
因子和 s是积性函数,即 :gcd(a,b)=1==> s(a*b)= s(a)*s(b) 2004^X=2^2X * 3^X *167^X, s(2004^X)= s(2^(2X))* s(3^X) * s(167^X)
如果 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
另外, (a/c)%m = a%m*d, 其中d*c = 1mod(29).且d满足最小。
因子和 s是积性函数,即 :gcd(a,b)=1==> s(a*b)= s(a)*s(b) 2004^X=2^2X * 3^X *167^X, s(2004^X)= s(2^(2X))* s(3^X) * s(167^X)
如果 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
另外, (a/c)%m = a%m*d, 其中d*c = 1mod(29).且d满足最小。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int num[3]={2,1,1}, prime[3]={2,3,167}; int tnum[3]; int getvalue(int k) { int tmp, tk, v; tk = tnum[k]+1; tmp = prime[k]; v = 1; while (tk) { if (tk&1) v = (v*tmp)%29; tmp = (tmp*tmp)%29; tk >>= 1; } return v; } int getd(int c) { int tmp, t; tmp = c; t = tmp; while (tmp%29 != 1) tmp += t; return tmp/c; } int main() { int i, x, d1, d2; while (scanf("%d", &x) != EOF && x) { memcpy(tnum, num, sizeof(tnum)); for (i = 0; i < 3; ++i) tnum[i] *= x; int a[3]; for (i = 0; i < 3; ++i) { a[i] = getvalue(i); } d1 = getd(2); d2 = getd(166); printf("%d\n", ((a[0]-1)*(a[1]-1)*d1*(a[2]-1)*d2)%29); } return 0; }
相关文章推荐
- 1452 Happy 2004 (所有因子求和)
- HDU 1452 Happy 2004 求2004^n的所有因子和 积性函数应用
- hdu 1452 Happy 2004 因子和
- HDU-1452 Happy 2004(逆元+因子和+费马定理)
- HDU 1452 Happy 2004 (素因子分解+快速幂模+乘法逆元)
- HDU 1452 Happy 2004(因子和)
- [数论]HDU 1452 Happy 2004 素因子分解+快速幂模+乘法逆元
- HDOJ 题目1452 Happy 2004()
- HDU 1452 Happy 2004(因子和的积性函数)
- HDU 1452 Happy 2004 (因子和)
- HDU 1452 Happy 2004(唯一分解定理)
- HDU 1452 Happy 2004
- Hdu 1452 Happy 2004(除数和函数,快速幂乘(模),乘法逆元)
- Happy 2004&&http://acm.hdu.edu.cn/showproblem.php?pid=1452
- hdu 1452 Happy 2004
- [HDOJ1492]Happy 2004(数论,快速幂,逆元,积性函数)
- Hdu 1452 Happy 2004(除数和函数,快速幂乘(模),乘法逆元)
- hdu 1452 Happy 2004 膜拜这推导过程
- hdu 1452 Happy2004
- hdu 1452 Happy 2004 找循环节