快速幂模版与位运算

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。

完结。

猜你喜欢

转载自blog.csdn.net/qq_45859188/article/details/106430591