HDU - 5950 Recursive sequence

本文介绍了一种基于递归数列的游戏,该游戏由 Farmer John 和他的奶牛们一起玩。游戏中涉及数学运算,特别是递归数列的计算,并提供了一个算法实现方案来计算数列中第 N 项的具体数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Recursive sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2631    Accepted Submission(s): 1186


Problem Description
Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers a and b on a blackboard. And then, the cows would say their identity number one by one. The first cow says the first number a and the second says the second number b. After that, the i-th cow says the sum of twice the (i-2)-th number, the (i-1)-th number, and i4. Now, you need to write a program to calculate the number of the N-th cow in order to check if John’s cows can make it right. 
 

Input
The first line of input contains an integer t, the number of test cases. t test cases follow.
Each case contains only one line with three numbers N, a and b where N,a,b < 231 as described above.
 

Output
For each test case, output the number of the N-th cow. This number might be very large, so you need to output it modulo 2147493647.
 

Sample Input
2 3 1 2 4 1 10
 

Sample Output
85 369
Hint
In the first case, the third number is 85 = 2*1十2十3^4. In the second case, the third number is 93 = 2*1十1*10十3^4 and the fourth number is 369 = 2 * 10 十 93 十 4^4.


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#define max_ 200010
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;

struct mat
{
	ll num[30][30];
	int n;
}a;
int n,m,x,y;
mat mul(struct mat a,struct mat b)
{
	struct mat ans;
	ans.n=a.n;
	memset(ans.num,0,sizeof(ans.num));
	for(int i=1;i<=a.n;i++)
	{
		for(int j=1;j<=a.n;j++)
		{
			for(int k=1;k<=a.n;k++)
			{
				ans.num[i][j]+=(a.num[i][k]*b.num[k][j])%2147493647UL;
				ans.num[i][j]%=2147493647UL;
			}
		}
	}
	return ans;
}
void show(struct mat a)
{
	printf("%d\n",a.n);
	for(int i=1;i<=a.n;i++)
	{
		for(int j=1;j<=a.n;j++)
		{
			printf("%d ",a.num[i][j]);
		}
		printf("\n" );
	}
}
int fpow(int k)
{
	struct mat ans,tmp=a;
	ans.n=a.n;
	memset(ans.num,0,sizeof(ans.num));

	for(int i=1;i<=a.n;i++)
	{
		ans.num[i][i]=1;
	}
	while(k!=0)
	{
		if(k&1)
			ans=mul(ans,tmp);
		tmp=mul(tmp,tmp);
		k/=2;
	}
	// show(ans);
	int d=(y*ans.num[1][1]+x*ans.num[1][2]+81*ans.num[1][3]+27*ans.num[1][4]+9*ans.num[1][5]+3*ans.num[1][6]+ans.num[1][7])%2147493647UL;
	return d;
}
int main(int argc, char const *argv[]) {
	a.n=7;
	memset(a.num,0,sizeof(a.num));
	a.num[1][1]=1;
	a.num[1][2]=2;
	a.num[1][3]=1;
	a.num[2][1]=1;
	a.num[3][3]=1;
	a.num[3][4]=4;
	a.num[3][5]=6;
	a.num[3][6]=4;
	a.num[3][7]=1;
	a.num[4][4]=1;
	a.num[4][5]=3;
	a.num[4][6]=3;
	a.num[4][7]=1;
	a.num[5][5]=1;
	a.num[5][6]=2;
	a.num[5][7]=1;
	a.num[6][6]=1;
	a.num[6][7]=1;
	a.num[7][7]=1;
	int t;
	cin>>t;
	while(t--)
	{
		int k;
		cin>>k>>x>>y;
		if(k==1)
		{
			printf("%d\n",x );
			continue;
		}
		else if(k==2)
		{
			printf("%d\n",y );
			continue;
		}
		printf("%d\n",fpow(k-2));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值