Powered by:AB_IN 局外人
P1226 【模板】快速冪||取餘運算
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll maxn=5e6+10;
char buf[1 << 21], *p1=buf, *p2=buf;
inline ll getc(){
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline ll read() {
ll ret = 0,f = 0;char ch = getc();
while (!isdigit (ch)) {
if (ch == '-') f = 1;
ch = getc();
}
while (isdigit (ch)) {
ret = ret * 10 + ch - 48;
ch = getc();
}
return f ? -ret : ret;
}
ll quickmod (ll a, ll b ,ll c)//a不斷平方,b不斷減半,ret不斷乘a
{
ll ret=1%c;//排除b=0時
while(b){
if(b&1)//若b爲偶數,則(a^(b/2))^2。若b爲奇數,則((a^(b-1/2))^2)*a。
ret=ret*a%c;
a=a*a%c;
b=b>>1;//b=b/2
}
return ret;
}
ll a,b,c;
int main()
{
a=read();b=read();c=read();
printf("%lld^%lld mod %lld=%lld",a,b,c,quickmod(a,b,c));
return 0;
}
核心代碼
ll quickmod (ll a, ll b ,ll c)
{
ll ret=1%c;
while(b){
if(b&1)
ret=ret*a%c;
a=a*a%c;
b=b>>1;
}
return ret;
}
這裏更一下巨快讀,可能在codeblocks上顯示不出結果。快讀和快寫能顯示。
更一下位運算:a&1
判斷是否爲奇數。!(a&1)
判斷是否爲偶數。
來自老師的PPT。
完結。