HDU 1452 Happy 2004(因子和)
2013-10-03 22:31
316 查看
/************************************************************* 计算 2004^X的因子和 s(2004^X) mod M, M=29 s(2004^X)%29 因子和 s是积性函数,即 :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) 如果 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 (a*b)/c %M= a%M* b%M * inv(c) c*inv(c)=1 %M 模为1的所有数 inv(c)为最小可以被c整除的 inv(2)=15, inv(21)=18 2*15=1 mod 29, 18*21=1 mod 29 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 ***************************************************************/ //hdu 1452 #include <iostream> #include <cstdio> #include <cmath> using namespace std; int _pow( int a, int n ) { int b = 1; while( n > 1 ) if( n % 2 == 0 ) { a = ( a * a ) % 29; n /= 2; } else { b = b * a % 29; n--; } return a * b % 29; } int main() { int X; int a, b, c; while( cin >> X, X ) { a = _pow( 2, 2 * X + 1 ); b = _pow( 3, ( X + 1 ) ); c = _pow( 22, ( X + 1 ) ); cout << ( a - 1 ) * ( b - 1 ) * 15 * ( c - 1 ) * 18 % 29 << endl; } return 0; }
相关文章推荐
- hdu 1452 Happy 2004 因子和
- HDU 1452 Happy 2004(因子和的积性函数)
- [数论]HDU 1452 Happy 2004 素因子分解+快速幂模+乘法逆元
- HDU 1452 Happy 2004 (因子和)
- HDU-1452 Happy 2004(逆元+因子和+费马定理)
- HDU 1452 Happy 2004 (素因子分解+快速幂模+乘法逆元)
- HDU 1452 Happy 2004 求2004^n的所有因子和 积性函数应用
- HDU 1452 Happy 2004 (唯一分解定理 + 求等比数列前n项和)
- hdu 1452 Happy 2004
- HDU 1452 Happy 2004 (逆元+快速幂+积性函数)
- 【原创】【数论】HDU-1452 Happy 2004(约数和定理)
- hdu 1452 Happy 2004(数论:积性函数+快速幂+同余方程+扩展欧几里得算法)
- HDU 1452 Happy 2004(唯一分解定理)
- HDU 1452 Happy 2004
- hdu 1452 Happy 2004(数论(模P乘法逆元+快速幂取模))
- hdu 1452 Happy 2004
- HDU 1452 Happy 2004
- HDU 1452 Happy 2004 (积性函数)
- HDU 1452 Happy 2004
- hdu 1452 Happy 2004