快速乘/快速幂/矩阵快速幂
//快速乘
LLI Quick_mul(LLI a,LLI b,LLI mol){
a %= mol;
LLI re = 0;
while(b){
if(b & 1) re = (re + a) % mol;
b >>= 1;
a = (a << 1) % mol;
}
return re;
}
//快速幂 n ^ k % mod
LLI Fast_power(LLI n,LLI k,LLI mod){
LLI re = 1;
n = n % mod;
while(k){
if(k & 1) re = re * n % mod;
k = k >> 1;
n = n * n % mod;
}
return re;
}
//矩阵快速幂
int n,mod;//n代表矩阵的规模,mod代表矩阵相乘时每一项matrix[i][j]对mod取模
struct Matrax {
int matrix[Size][Size];//宏定义的Size
Matrax () {}
Matrax (int o) {//这是初始化矩阵(单位矩阵),其实o没有用,只是区别于上面的没有参数的构造函数
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
matrix[i][j] = (i == j);
}
Matrax operator*(const Matrax &m1)const {
Matrax m2;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
m2.matrix[i][j] = 0;
for(int k = 0; k < n; k ++)
m2.matrix[i][j] += (matrix[i][k] % mod * (m1.matrix[k][j] % mod)) % mod;
m2.matrix[i][j] %= mod;
}
}
return m2;
}
Matrax operator+(const Matrax &m1)const {
Matrax m2;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
m2.matrix[i][j] = (m1.matrix[i][j] % mod + matrix[i][j] % mod) % mod;
return m2;
}
};
Matrax Fast_power(Matrax A,int k) {
Matrax re(1),p = A;
while(k) {
if(k & 1) re = re * p,k --;
else k /= 2,p = p * p;
}
return re;
}