您的位置:首页 > 其它

HDU 1005(矩阵乘法)

2014-01-11 13:31 281 查看
A number sequence is defined as follows:

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

Given A, B, and n, you are to calculate the value of f(n).

题意:给出一个递推公式,求第N项。

题解:开始试图找出一个能够直接算的递推公式,没找到,所以考虑矩阵乘法。根据给出的递推公式可以设想:



可以使用找规律:

#include <iostream>
#include <cstring>

using namespace std;

int f[1000001];

int main()
{
int a,b,n;

while(cin>>a>>b>>n)
{
if(a==0&&b==0&&n==0)
break;
f[1]=1;
f[2]=1;
int xh=0;
int i;
for(i=3;i<=1001;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i]==1&&f[i-1]==1)
{

break;
}
}
xh=i-2;
n=n%xh;
if(n==0)n=xh;
cout<<f
<<endl;
}
return 0;
}


使用矩阵相乘:

#include <iostream>
#include <cstdio>
using namespace std;
const int N=10001;
const __int64 INF = 10e18;
typedef struct m
{
int a[2][2];
}Mat;
typedef struct o
{
int sno; //器官序号
int day;
}Cat;
Cat cat
; //

Mat E;//unit matrix;
void InitE(Mat& e)
{
e.a[0][0]=1;
e.a[0][1]=0;
e.a[1][0]=0;
e.a[1][1]=1;
}
Mat MatMul(Mat x,Mat y)
{
int i,j,k;
Mat c;
for(i=0;i<2;++i)
for(j=0;j<2;++j)
{
c.a[i][j]=0;
for(k=0;k<2;++k)
{
c.a[i][j]+=x.a[i][k] * y.a[k][j];
}
c.a[i][j] %=7;
}
return c;
}
Mat MatPow(Mat d,int n) //matrix binary divide,calculate n power of matrix a
{
Mat t=E;

while(n>0)
{
if(n&1)
t=MatMul(t,d);
d = MatMul(d,d);
n>>=1;
}
return t;
}
int main()
{
int p,q,n;
while(cin>>p>>q>>n && p|q|n)
{
if(n<3)
cout<<1<<endl;
else
{
InitE(E); //init unit matrix
Mat m;
m.a[0][0] = p;
m.a[0][1] = q;
m.a[1][0] = 1;
m.a[1][1] = 0;
m = MatPow(m,n-2);
cout<<(m.a[0][0]+m.a[0][1])%7<<endl;
}

}
return 0;
}


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