快速冪模版與位運算

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。

完結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章