快速幂

快速幂

板子

ll qpow(ll a, ll x){//普通快速幂
	ll res = 1;
	while(x > 0){
		if(x & 1) res *= a;
		a *= a;
		x >>= 1;
	}
	return res;
}

ll qpow(ll a, ll x, ll p){//模意义下取幂
	a %= p;
	ll res = 1;
	while(x > 0){
		if(x & 1) res = res * a % p;
		a = a * a % p;
		x >>= 1;
	}
	return res;
}

相关资料

  1. https://oi-wiki.org/math/binary-exponentiation/
  2. 代码展示
//>>>Qiansui
#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<string>
#include<vector>
#include<iomanip>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

using namespace std;
const int mod=998244353;

ll qpow(ll a,ll x){//递归实现
    if(x==0) return 1;
    ll res=qpow(a,x/2);
    res*=res;
    if(x%2) res*=a;
    return res;
}

ll qpow1(ll a,ll x){//迭代实现
    ll res=1;
    while(x>0){
        if(x&1) res*=a;//x&1 !!!
        a*=a;//大数这里容易爆吧。。。
        x>>=1;
    }
    return res;
}

ll qpow2(ll a,ll x,ll m){//模意义下取幂
    a%=m;
    ll res=1;
    while(x>0){
        if(x&1) res=(res*a)%m;
        a=(a*a)%m;
        x>>=1;
    }
    return res;
}

signed main(){
	cout<<qpow(2,30)<<'\n';
	cout<<qpow1(2,30)<<'\n';
	cout<<qpow2(2,30,mod)<<'\n';
	return 0;
}

相关题目

posted on 2023-03-27 22:00  Qiansui  阅读(9)  评论(0编辑  收藏  举报