2016年双基杯1005(快速幂+大数取模+费马小定理)

题目链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?cid=30942&pid=1005

 

题意:求 y=e^(b*lna+lnc)%(1e9+7); (a,c<=10^12,b<=10^100000)

 

思路:原式化简得

y=a^b*c%(1e9+7)

b太大了不能用快速幂

我们可以用费马小定理

若 p为质数,则有: a^b%p=a^(b%(p-1));

所以: y=a^(b%(p-1))*c%p;

 

代码:

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define MAXN 100010
 4 using namespace std;
 5 
 6 ll p=1e9+7;
 7 char b[MAXN];
 8 
 9 ll mod(){  //**大数取模
10     ll ans=0;
11     for(int i=0; i<strlen(b); i++){
12         int gg=b[i]-'0';
13         ans=(ans*10+gg)%(p-1);
14     }
15     return ans;
16 }
17 
18 ll get_pow(ll x, ll n){  //**快速幂
19     ll ans=1;
20     while(n){
21         if(n&1){
22             ans=(ans*x)%p;
23         }
24         x=x*x%p;
25         n>>=1;
26     }
27     return ans;
28 }
29 
30 int main(void){
31     ll a, c;
32     while(~scanf("%lld%s%lld", &a, b, &c)){
33         a%=p;
34         c%=p;
35         ll ans=mod();
36         ans=get_pow(a, ans);
37         ans=(ans*c)%p;
38         printf("%lld\n", ans);
39     }
40     return 0;
41 }

 

posted @ 2016-11-21 18:08  geloutingyu  阅读(263)  评论(0编辑  收藏  举报