快速幂
快速幂
板子
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;
}
相关资料
//>>>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;
}
相关题目
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17263187.html