hdu5950 Recursive sequence题解

链接:hdu5950 Recursive sequence
题意:f[1]=a,f[2]=b,f[i]=f[i-1]+2f[i-2]+i^4(I>=3),求f[n]%mod 。
思路
矩阵快速幂
首先构造矩阵,如下:
(n+1)4=n4+4
n3+6n2+4n+1.
在这里插入图片描述
然后直接写代码就行了。
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const ll MOD=2147493647;
ll c1[7];
ll c[7][7];
ll t;
ll n,a1,b1;
void mul(ll f[7] ,ll a[7][7]){
	memset(c1,0,sizeof(c1));
	for(int i=0;i<7;i++)
		for(int j=0;j<7;j++)
			c1[i]=(c1[i]%MOD+f[j]*a[j][i]%MOD)%MOD;
	memcpy(f,c1,sizeof(c1));
}
void mulself(ll a[7][7]){
	memset(c,0,sizeof(c));
	for(int i=0;i<7;i++)
		for(int j=0;j<7;j++)
			for(int k=0;k<7;k++)
				c[i][j]=(c[i][j]%MOD+a[i][k]%MOD*a[k][j]%MOD)%MOD;
	memcpy(a,c,sizeof(c));
}
int main(){
	cin>>t;
	while(t--){
		cin>>n>>a1>>b1;
		ll f[7]={b1,a1,81,27,9,3,1};
		ll a[7][7]={ {1,1,0,0,0,0,0},
					 {2,0,0,0,0,0,0},
					 {1,0,1,0,0,0,0},
					 {0,0,4,1,0,0,0},
					 {0,0,6,3,1,0,0},
					 {0,0,4,3,2,1,0},
					 {0,0,1,1,1,1,1}};
		if(n==1) printf("%lld\n",a1%MOD);
		else if(n==2) printf("%lld\n",b1%MOD);
		else {
			n-=2;
			while(n){
				if(n&1) mul(f,a);
				mulself(a);
				n>>=1;
			}
			printf("%lld\n",f[0]);
		}
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值