【矩阵快速幂】EOJ EOJ Monthly 2021.9 Sponsored by TuSimple A. Amazing Discovery

Problem A: Amazing Discovery

评测传送门
蒟蒻赛时就开了这么一个题,推了好久也还是推不出来😣
看了人家官方题解后,顺利AC。但是,这个推导过程有点搞怪啊,不是看了题解,我还真推不出来这个递推关系。
在这里插入图片描述
官方题解:
题解传送门
在这里插入图片描述
下面我提供一些推导过程中的式子,可自行代入验证一波。
这里提供一个可以进行数学计算的超强👉代数计算工具网站
S 1 = 2 a S_1 =2a S1=2a
S 2 = 2 a 2 + 2 b S_2 = 2a^2+2b S2=2a2+2b
S 3 = 2 a 3 + 6 a b S_3 = 2a^3+6ab S3=2a3+6ab
S 4 = 2 a 4 + 2 b 2 + 12 a 2 b S_4 = 2a^4+2b^2+12a^2b S4=2a4+2b2+12a2b
S 5 = 2 a 5 + 10 a b 2 + 20 a 3 b S_5 = 2a^5+10ab^2+20a^3b S5=2a5+10ab2+20a3b
S 5 = 2 a ∗ S 4 − ( a 2 − b ) S 3 S_5 = 2a * S_4 - (a^2-b)S_3 S5=2aS4(a2b)S3
矩阵快速幂中A矩阵的构造:
[ S n , S n + 1 ] [S_n,S_{n+1}] [Sn,Sn+1] × A A A = [ S n + 1 , S n + 2 ] [S_{n+1},S_{n+2}] [Sn+1,Sn+2]

A = [ 0 b − a 2 1 2 a ] A= \begin{gathered} \begin{bmatrix} 0 & b-a^2 \\ 1 & 2a \end{bmatrix} \end{gathered} A=[01ba22a]
初始矩阵为: F 0 = [ 2 , 2 a ] F0 = [2,2a] F0=[2,2a]
之后直接矩阵快速幂计算即可。
AcCoding:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int N = 2;
/*
2a * S[n-1] - S[n] = (a - b * b) * S[n - 2]
f0[2] = {S[n],S[n+1]}
A = {
	{0,2a},
	{1,b * b - a}
}
*/
void mul(ll c[][N], ll a[][N], ll b[][N]) {
	static ll tmp[N][N];
	memset(tmp, 0, sizeof tmp);
	for (int i = 0;i < N;i++) {
		for (int j = 0;j < N;j++) {
			for (int k = 0;k < N;k++) {
				(tmp[i][j] += a[i][k] % mod * b[k][j] % mod) %= mod;
			}
		}
	}
	memcpy(c, tmp, sizeof tmp);
}
int main() {
	ll a, b, n; scanf("%lld%lld%lld", &a, &b, &n);
	ll f[N][N] = { 2 * a, 2ll * a * a + 2ll* b };//n = 1
	ll A[N][N] = {
		{0,((b - a * a) % mod + mod) % mod},
		{1,2ll * a % mod}
	};
	n--;
	while (n) {
		if (n & 1) mul(f, f, A);
		mul(A, A, A);
		n >>= 1;
	}
	ll res = (f[0][0] % mod + mod) % mod;
	printf("%lld", res);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值