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 }
我就是我,颜色不一样的烟火 --- geloutingyu