FZU1752(快速冪+快速乘法)
阿新 • • 發佈:2019-02-10
Problem 1752 A^B mod C
Accept: 1126 Submit: 5065
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).
Input
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
Output
For each testcase, output an integer, denotes the result of A^B mod C.
Sample Input
3 2 4
2 10 1000
Sample Output
1
24
解法:快速乘法:15x5=75=15+60;換成二進位制就是代表 1111+111100=75;跟快速冪一樣在乘數右移一位,被乘數左移一位,當乘數與1為真時 值加1;
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; ll mulit(ll a,ll b,ll c)//快速乘 { ll ans=0; a%=c; while(b) { if(b&1) { ans+=a; if(ans>c){ans-=c;}//大於減c } a<<=1; if(a>=c)a-=c; b>>=1; } return ans; } ll quick(ll a,ll b,ll c)//求階乘 { ll ans=1; while(b) { if(b&1){ans=mulit(ans,a,c);} a=mulit(a,a,c); b>>=1; } return ans; } int main() { ll a,b,c; while(~scanf("%I64d%I64d%I64d",&a,&b,&c)) { printf("%I64d\n",quick(a,b,c)); } return 0; }