同余模
(a+b)%n = ((a%n) + (b%n)) % n
(a-b)%n = ((a%n) - (b%n) + n) % n
(a*b)%n = (a%n)(b%n) % n
快速幂
原理:
3 ^ 999
= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
#include <iostream>
using namespace std;
void km(){//快速幂
int a,n;
cin >> a >> n;
int pow = 1;
while (n){
if (n&1){
pow *= a;
}
a *= a;
n >>= 1;
}
cout << pow << endl;
return;
}
void kmm(){//快速幂模
int a,n,c;
cin >> a >> n >> c;
int pow = 1;
while (n){
if (n&1){ //等价于 (n%2)==1
pow =(pow*a)%c;
}
a =(a*a)%c;
n >>= 2; //等价于 n/=2
}
cout << pow << endl;
return 0;
}
int main() {
km();
// kmm();
return 0;
}
输入正整数a、n、m,输出a^n%m的值。a,n,m<=10^9。
int pow_mod(int a, int n, int m)
{
int ans = 1;
for(int i=0; i<n; i++)
{
ans = (int)((long long)ans * n % m);
}
}
分治改进:
int pow_mod(int a, int n, int m)
{
if(n == 0) return 1;
int x = pow_mod(a, n/2, m);
long long ans = (long long)x * x % m;
if(n%2 == 1) ans = ans * a % m;
return (int)ans;
}