您的位置:首页 > 产品设计 > UI/UE

hdu 1005 Number Sequence(矩阵快速幂,找规律,模版更通用)

2014-02-25 20:53 483 查看
题目

第一次做是看了大牛的找规律结果,如下:

//简单的矩阵快速幂
//f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
//注意origin矩阵中的第二行的a和b的位置摆放
#include<stdio.h>
#include<string.h>
int num=2,mod=7;
struct matrix
{
int a[2][2];
};
matrix multiply(matrix x,matrix y)//矩阵乘法
{
matrix temp;
memset(temp.a,0,sizeof(temp.a));
for(int i=0;i<num;i++)
{
for(int k=0;k<num;k++)
{
for(int j=0;j<num;j++)
{
temp.a[i][j]=(temp.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return temp;
}
matrix calc(matrix a,int n)//矩阵快速幂——a^n
{
if(n==1)return a;
matrix e;
for(int i=0;i<num;i++)
for(int j=0;j<num;j++)
e.a[i][j]=(i==j);

while(n)
{
if(n&1)
e=multiply(e,a);
n>>=1;
a=multiply(a,a);
}
return e;
}
int main()
{
int n,a,b;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
if(a==0&&b==0&&n==0)break;
matrix origin= {0,1};
origin.a[1][0]=b;origin.a[1][1]=a;
matrix answ={1,0,
1,0};
if(n>2)
answ=multiply(calc(origin,n-2),answ);
printf("%d\n",answ.a[1][0]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: