您的位置:首页 > 其它

题目1081:递推数列

2013-12-09 20:28 288 查看
题目描述:
给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:
输入包括5个整数:a0、a1、p、q、k。

输出:
第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5

样例输出:
8359


#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

const int  MOD = 10000;

/*
A(k)     = (p q)^(k-1)  *a1
A(k-1)   = (1 0)        *a0
*/

inline void MatrixMul( int m[][2], int n[][2] )
{
int s[2][2];
memset(s,0,sizeof(s));

int i;
int j;
int k;

for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
for( k = 0; k < 2; k++)
s[i][j] += m[i][k]*n[k][j];

for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
m[i][j] = s[i][j]%MOD;

}

void MatrixN ( int m[][2], int n )
{
int t[2][2]={{m[0][0],m[0][1]},{m[1][0],m[1][1]}};

if (n == 1)
return;
else if ( n%2 == 0)
{
MatrixN(m,n/2);
MatrixMul(m,m);
}
else
{
MatrixN(m,n-1);
MatrixMul(m,t);
}
}

int main(void)
{
int a;
int a0;
int a1;
int p;
int q;
int k;

int m[2][2];

while (cin >> a0 >>a1 >> p >> q >> k )
{
if (k == 0)
a = a0;
else
if (k == 1)
a = a1;
else
{
m[0][0] = p%MOD;
m[0][1] = q%MOD;
m[1][0] = 1;
m[1][1] = 0;

MatrixN(m,k-1);

a = m[0][0] * a1 + m[0][1] * a0;
}
cout<<a%MOD<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: