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 qm (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,qm(a,b,c));
return 0;
}
核心代码
ll qm (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;
}
ll q (ll a, ll b){
ll ret=1;
while(b){
if(b&1)
ret=ret*a;
a=a*a;
b=b>>1;
}
return ret;
}
这里更一下巨快读,可能在codeblocks上显示不出结果。快读和快写能显示。
更一下位运算:a&1
判断是否为奇数。!(a&1)
判断是否为偶数。
来自老师的PPT。
完结。