快速幂
11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹转化为算 a2^0 * a2^1 * a2^3,也就是a1*a2*a8
int pow(int a, int b) //求a的b次方
{
int ans = 1, base = a;//base初始为a的一次方
while (b != 0)
{
if (b&1 )//若二进制末位为1,取二进制末位
{
ans *= base;//结果乘以a在此位置的次方
}
base *= base;//base平方一下,进到下一个二进制位
b >>= 1;//b的二进制右移
}
return ans;
}
快速乘
long long cheng(int a,long long n)
{
long long res = 0;
while(n)//与快速幂基本一样,唯一的区别就是把*改成+
{
if(n&1)
{
res += a;
}
a += a;
n>>=1;
}
return res;
}
矩阵快速幂
struct matrix//矩阵结构体
{
int data[1000][1000];
} a,b;
//矩阵的乘法
matrix mult(matrix a, matrix b,int aa,int bb,int nn) //矩阵a,矩阵b,a的列数,b的行数,a的行数
{
matrix c;
memset(c.data,0,sizeof(c.data));
for(int i = 0; i < nn; i ++)
{
for(int j = 0; j < aa; j ++)
{
if(a.data[j][i] != 0)
{
for(int k = 0; k < bb; k ++)
{
if(b.data[i][k] != 0)
{
c.data[j][k] += a.data[j][i]*b.data[i][k];
}
}
}
}
}
return c;
}
//快速幂(求矩阵a的n次幂)
matrix quick(matrix a,int n,int aa)
{
matrix ans;
memset(ans.data,0,sizeof(ans.data));
for(int i = 0; i < aa; i++)//单位矩阵赋值
{
ans.data[i][i] = 1;
}
while(n)
{
if(n&1)
{
ans = mult(ans,a,n,n,n);//与快速乘类似
}
a= mult(a,a,n,n,n);
n>>= 1;
}
return ans;
}