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 }

 

posted @ 2018-05-10 11:03  _努力努力再努力x  阅读(217)  评论(0编辑  收藏  举报