您的位置:首页 > 其它

快速幂与矩阵快速幂

2016-09-01 22:33 351 查看
快速幂模板:

const int MOD = 10007;
int qm(int a, int n)//a^n%MOD
{
int sum= 1;
while(n) {
if(n & 1) sum= sum* a % MOD;   //n&1是n%2
a = a * a % MOD;
n >>= 1; //n/=2;
}
return sum;
}


矩阵快速幂:(用于求递推公式题)

/*
已知矩阵t,求t的n次方
*/
#include<cstdio>
using namespace std;
const int mod=10000;/*求余*/
struct Matrix
{
int m[2][2]; /*下标从0开始*/
};

Matrix Mul(Matrix a,Matrix b)/*矩阵乘法*/
{
Matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.m[i][j]= (c.m[i][j]+a.m[i][k]*b.m[k][j] + mod)%mod;
return c;
}

Matrix fastm(Matrix a,int n) /*矩阵a的n次方*/
{
Matrix res;/*初始化为单位矩阵*/
memset(res.m,0,sizeof(res.m));
res.m[0][0] = res.m[1][1]=1;
while(n)
{
if(n&1) res = Mul(res,a);
n>>=1;
a = Mul(a,a);
}
return res;
}

int main()
{
//   freopen("input.txt","r",stdin);
int n;
while(~scanf("%d",&n)){
if(n==-1) break;
Matrix t;
t.m[0][0]=1;t.m[0][1]=1;
t.m[1][0]=1;t.m[1][1]=0;
printf("%d\n",fastm(t,n).m[1][0]);
}
return 0;
}
例题:fibonacci数列(二)
,递推求值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息