hdu1852 Beijing 2008
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1852
题目大意:
求2008^n的所有因子和m对k取余,然后求2008^m对k取余。
解题思路:
首先将2008因式分解,2008 = 2^3 * 251
所以2008^n = 2^(3n) * 251^(n)
因子和m =(2^(3n+1)- 1) * (251^(n+1) - 1)/ 250
m需要对k取余数。由于余数k和250可能不互质,也就是没有逆元存在,那么需要用到通用公式:
所以可以用快速幂求出(2^(3n+1)- 1) mod k
再求出(251^(n+1) - 1)mod (250 * k) / 250
两者相乘再对k求余数作为2008的指数
最后快速幂求出答案
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll pow(ll a, ll b, ll m) 5 { 6 ll ans = 1; 7 a %= m; 8 while(b) 9 { 10 if(b & 1)ans = ans * a % m; 11 b /= 2; 12 a *= a; 13 a %= m; 14 } 15 return ans; 16 } 17 int main() 18 { 19 ll n, k; 20 while(cin >> n >> k && n) 21 { 22 ll a = pow(2, 3 * n + 1, k) - 1; 23 ll b = (pow(251, n + 1, 250 * k) - 1) % (250 * k); 24 b /= 250; 25 cout<<pow(2008, (a * b) % k, k)<<endl;//此处必须a*b需要先对k取余数,题目求的是因子和m对k取余数作为指数的值 26 } 27 return 0; 28 }
越努力,越幸运