快速幂, 快速乘
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll __int64
ll mod;
ll mul(ll a, ll b){
ll ans = 0;
a = a% mod;
while(b){
if(b & 1 == 1){
ans += a;
if(ans >= mod) ans-= mod;
}
a += a;
if(a >= mod) a -= mod;
b >>= 1;
}
return ans;
}
ll poww(ll a, ll b){
ll ans = 1;
a = a % mod;
while(b){
if(b & 1 == 1)
ans = mul(ans ,a);
a = mul(a, a);
b >>= 1;
}
return ans;
}
int main(){
long long a, b;
while(~scanf("%I64d %I64d %I64d", &a, &b, &mod)){
printf("%I64d\n", poww(a, b));
}
return 0;
}
矩阵乘法
typedef struct stu{
int m[12][12];
}matrix;
int n;
matrix a, b;
matrix mul(matrix a, matrix b){
matrix s;
int i, j, k;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
s.m[i][j] = 0;
for(k = 0; k < n; k++)
s.m[i][j] = (s.m[i][j] + a.m[i][k]*b.m[k][j]%mod)%mod;
}
}
return s;
}
matrix poww(matrix a, int k){
matrix b;
for(int i = 0; i < n; i++) b.m[i][i] = 1;
while(k){
if(k &1== 1){
b = mul(b, a);
}
a = mul(a, a);
k >>= 1;
}
return b;
}