本文亦发表于笔者博客:https://www.codein.icu/nowcoderweekly19/
C
第 次长出来的花瓣数记为
,可以得到
,进而推知
,而记录所有
的和即为答案。
构造 的初始矩阵,分别代表
和
,
,构造一个
的转移矩阵矩阵,用矩阵快速幂即可。
建议自己手写个表感受一下数据,方便初始构造。
当然,具体构造方法各位按自己顺手的来吧。
#include <cstdio>
#include <algorithm>
#include <ctype.h>
const int bufSize = 1e6;
#define DEBUG
inline char nc()
{
#ifdef DEBUG
return getchar();
#endif
static char buf[bufSize], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, bufSize, stdin), p1 == p2) ? EOF : *p1++;
}
inline void read(char *s)
{
static char c;
for (; !isalpha(c); c = nc());
for (; isalpha(c); c = nc()) *s++ = c;
*s = '\0';
}
template<typename T>
inline T read(T &r)
{
static char c;
static int flag;
flag = 1, r = 0;
for (c = nc(); !isdigit(c); c = nc()) if (c == '-') flag = -1;
for (; isdigit(c); c = nc()) r = r * 10 + c - 48;
return r *= flag;
}
const int mod = 998244353;
const int maxn = 10;
struct matrix
{
int n,m;
long long a[maxn][maxn];
matrix()
{
for(int i = 0;i<=4;++i) for(int j = 0;j<=4;++j) a[i][j] = 0;
}
matrix operator*(const matrix b)
{
matrix res;
res.n = n,res.m = b.m;
for(int i = 1;i<=n;++i)
for(int j = 1;j<=m;++j)
for (int k = 1; k <= b.m; ++k) res.a[i][k] = (res.a[i][k] + a[i][j] * b.a[j][k]) % mod;
return res;
}
};
long long k;
int main()
{
read(k);
matrix A,S,X;
A.n = A.m = 3;
A.a[1][2] = 1,A.a[1][3] = 1,A.a[2][1] = 1,A.a[2][2] = 1,A.a[3][3] = 1;
X.n = X.m = 3;
for(int i = 1;i<=3;++i) X.a[i][i] = 1;
S.n = 1,S.m = 3;
S.a[1][1] = 1,S.a[1][2] = 1,S.a[1][3] = 0;
while(k)
{
if(k & 1) X = X * A;
A = A * A;
k >>= 1;
}
S = S * X;
// printf("%lld %lld %lld",S.a[1][1],S.a[1][2],S.a[1][3]);
printf("%lld\n",(S.a[1][1] + S.a[1][3]) % mod);
return 0;
} 
京公网安备 11010502036488号