一、快速幂
给定三个正整数\(a,b,p\),求出\(a^b%p\)的值。
代码如下:
int power(int a, int b, int p)
{
int ans = 1 % p;
while(b)
{
if(b & 1) ans = (long long) ans * a % p;
b >>= 1;
a = (long long) (a * a) % p;
}
return ans;
}
二、矩阵乘法+快速幂
给一个矩阵\(A\),求出\(A^k\)的值(矩阵中所有元素都对\(mod\)取模)。
代码如下:
struct matrix
{
int l, w;
long long mat[111][111];
matrix()
{
memset(mat, 0, sizeof mat);
}//初始化
} A;
matrix create(int l, int w)
{
matrix c;
c.l = l, c.w = w;
for(int i = 0; i < l; ++ i)
for(int j = 0; j < w; ++ j)
c.mat[i][j] = 1;
return c;
}
matrix operator *(matrix a, matrix b)
{
matrix c;
c.l = a.l;
c.w = b.w;
for(int i = 0; i < a.l; ++ i)
for(int j = 0; j < c.w; ++ j)
for(int k = 0; k < a.w; ++ k)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % mod;
return c;
}
//calculate a ^ b % mod
matrix mat_power(matrix a, long long b)
{
matrix ans;
ans.l = n, ans.w = n;
if(b == 0) return create(n, n);
for(int i = 0; i < n; ++ i) ans.mat[i][i] = 1;
while(b)
{
if(b & 1) ans = ans * a;//跟普通快速幂一致
b >>= 1;
a = a * a;
}
return ans;
}