作者:雨里漾_968 | 来源:互联网 | 2023-10-10 11:07
篇首语:本文由编程笔记#小编为大家整理,主要介绍了矩阵快速幂EOJEOJMonthly2021.9SponsoredbyTuSimpleA.AmazingDiscovery相关
篇首语:本文由编程笔记#小编为大家整理,主要介绍了矩阵快速幂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=2a∗S4−(a2−b)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= \\begingathered \\beginbmatrix 0 & b-a^2 \\\\ 1 & 2a \\endbmatrix \\endgathered
A=[01b−a22a]
初始矩阵为:
F
0
=
[
2
,
2
a
]
F0 = [2,2a]
F0=[2,2a]
之后直接矩阵快速幂计算即可。
AcCoding:
#include
#include
#include <iostream>
#include
using namespace std;
typedef long long ll;
const int mod &#61; 998244353;
const int N &#61; 2;
void mul(ll c[][N], ll a[][N], ll b[][N])
static ll tmp[N][N];
memset(tmp, 0, sizeof tmp);
for (int i &#61; 0;i < N;i&#43;&#43;)
for (int j &#61; 0;j < N;j&#43;&#43;)
for (int k &#61; 0;k < N;k&#43;&#43;)
(tmp[i][j] &#43;&#61; a[i][k] % mod * b[k][j] % mod) %&#61; mod;
memcpy(c, tmp, sizeof tmp);
int main()
ll a, b, n; scanf("%lld%lld%lld", &a, &b, &n);
ll f[N][N] &#61; 2 * a, 2ll * a * a &#43; 2ll* b ;
ll A[N][N] &#61;
0,((b - a * a) % mod &#43; mod) % mod,
1,2ll * a % mod
;
n--;
while (n)
if (n & 1) mul(f, f, A);
mul(A, A, A);
n >>&#61; 1;
ll res &#61; (f[0][0] % mod &#43; mod) % mod;
printf("%lld", res);
return 0;