快速積 快速冪(以及取餘)運算C/C++
#include <bits/stdc++.h>
using namespace std;
//簡單來說就是把b當成2進位制形式,然後累加;
// 2*7=2*(1*2^0+1*2^1+1*2^2)=2*1*2^0+2*1*2^1+2*1*2^2;
long long FastMul(long long a,long long b) //快速積 a*b
{
long long ans=0;
while(b){
if(b&1) //二進位制數b各位如果為1
ans+=a;
a+=a;
b>>=1; //右移1位,相當於除以2
}
return ans;
}
long long FastExp(long long a,long long b) //快速冪 a^b
{
long long ans=1;
while(b){
if(b&1)
ans*=a;
a*=a;
b>>=1;
}
return ans;
}
//快速積取模簡單來說就和上面說明一樣,只是每次多一個取餘過程,下次運算加上上次的餘數;
// 2*7%5=2*(1*2^0+1*2^1+1*2^2)%5=(2*1*2^0%5+2*1*2^1%5+2*1*2^2%5)%5 (不知道是不是這樣表達的,嘻嘻)
long long FastMulMod(long long a,long long b,long long c) //快速積取模 a*b%c
{
long long ans=0;
while(b){
if(b&1)
ans=(ans+a)%c;
a=(a+a)%c;
b>>=1;
}
return ans;
}
long long FastExpMod(long long a,long long b,long long c) //快速冪取模 a^b%c
{
long long ans=1;
while(b){
if(b&1)
ans=(ans*a)%c;
a=(a*a)%c;
b>>=1;
}
return ans;
}
int main()
{
printf("%ld\n",FastMul(100,100));
printf("%ld\n",FastExp(2,10));
printf("%ld\n",FastMulMod(3,93,5));
printf("%ld\n",FastExpMod(2,9,5));
return 0;
}