常系数线性齐次递推

已知 fx = a0fx-1 + a1fx-2 + … + an-1fx-n 和 f0, f1, …, fn-1,给定 t ,求 ft

f 的递推可以看成一个 n × m 的矩阵 A 乘以一个 n 维列向量β,因为矩阵乘法满足结合律,用快速幂可以加速。

时间复杂度:O(n3logt)

输入:
a 常系数数组
b 初值数组
n 数组大小
t 要求解的项数
输出:
函数在第 t 项的值 ft

int solve(int a[], int b[], int n, int t)
{
	Matrix M, F, E;
	M.clear(), F.clear(), E.clear();
	M.n = M.m = n;
	E.n = E.m = n;
	F.n = n, F.m = 1;
	for(int i = 0; i < n - 1; ++i)
		M.a[i][i + 1] = 1;
	for(int i = 0; i < n; ++i)
	{
		M.a[n - 1][i] = a[i];
		F.a[i][0] = b[i];
		E.a[i][i] = 1;
	}
	if(t < n) return F.a[t][0];
	for(t -= n - 1; t; t /= 2)
	{
		if(t & 1) E = M * E;
		M = M * M;
	}
	F = E * F;
	return F.a[n - 1][0];
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值