同余模
(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; }