51Nod-1046 A^B Mod C (快速幂,了解快速幂及对 A^B Mod C的求解)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出3个正整数A B C,求A^B Mod C。
 
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Input示例
3 5 8
Output示例
3

下面是a^b快速幂的函数。
 1 int poww(int a,int b){
 2     int ans=1,base=a;
 3     while(b!=0){
 4         if(b&1!=0)
 5           ans*=base;
 6         base*=base;
 7         b>>=1;
 8   }
 9     return ans;
10 }

下面是关于A^B Mod C的类型。

1:A=A*A的地方要取模

2:还有结果的地方都要取模

 1 #include<stdio.h>
 2 long long poww(long long a,long long b,long long c)
 3 {
 4     long long ans=1,base=a;
 5     while (b!=0)
 6     {
 7         if(b&1!=0)
 8         {
 9             ans*=base;
10             ans=ans%c;//这里取模←←←←←←←←←←←←
11         }
12         base*=base;
13         base=base%c;//这里取模←←←←←←←←←←←←
14         b>>=1;
15     }
16     return ans%c;//这里取模←←←←←←←←←←←←
17 }
18 int main()
19 {
20     long long A,B,C;
21     scanf("%lld%lld%lld",&A,&B,&C);
22     if(B%2==0)
23     {
24         A=(A*A)%C;//这里取模←←←←←←←←←←←←
25         printf("%lld\n",poww(A,B/2,C)%C);
26     }
27     else
28     {
29         long long Q=A;
30         A=(A*A)%C;//这里取模←←←←←←←←←←←←
31         printf("%lld\n",(poww(A,B/2,C)*Q)%C);
32     }
33     return 0;
34 }

 

 

posted @ 2018-07-13 16:42  jealous-boy  阅读(289)  评论(0编辑  收藏  举报