Educational Codeforces Round 51 (Rated for Div. 2) D. Bicolorings

Bicolorings

time limit per test: 2 second
memory limit per test: 256 megabytes
input: standard input
output: standard output

You are given a grid, consisting of 2 2 2 rows and n n n columns. Each cell of this grid should be colored either black or white.

Two cells are considered neighbours if they have a common border and share the same color. Two cells A A A and B B B belong to the same component if they are neighbours, or if there is a neighbour of A A A that belongs to the same component with B B B.

Let’s call some bicoloring beautiful if it has exactly k k k components.

Count the number of beautiful bicolorings. The number can be big enough, so print the answer modulo 998244353 998244353 998244353.

Input

The only line contains two integers n n n and k k k ( 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000, 1 ≤ k ≤ 2 n 1 \le k \le 2n 1k2n) — the number of columns in a grid and the number of components required.

Output

Print a single integer — the number of beautiful bicolorings modulo 998244353 998244353 998244353.

Example

i n p u t \tt input input
3 4
o u t p u t \tt output output
12
i n p u t \tt input input
4 1
o u t p u t \tt output output
2
i n p u t \tt input input
1 2
o u t p u t \tt output output
2

Note

One of possible bicolorings in sample 1 1 1:

Tutorial

本题可以用动态规划来解决,对于这一个 2 × n 2 \times n 2×n 的矩阵,一定是一列一列进行递推,由于只有 2 2 2 行,所以对于每一列一共只有 4 4 4 种状态,可以令 d p i , j , k dp_{i, j, k} dpi,j,k 表示前 i i i 列形成 j j j 个连通块,第 i i i 列的状态为 k k k,其中 k k k 的状态表示为
k = { 0 , 两个白块 1 , 上白下黑 2 , 上黑下白 3 , 两个黑块 k= \left\{\begin{matrix} 0,两个白块 \\ 1,上白下黑 \\ 2,上黑下白 \\ 3,两个黑块 \\ \end{matrix}\right. k= 0,两个白块1,上白下黑2,上黑下白3,两个黑块

  • 如果前一列是纯色的:新的一列如果和原一列完全一致,则不增加连通块数量;否则,连通块数量总是增加 1 1 1

  • 如果前一列是混色的:新的一列如果和前一列完全不一致,则增加 2 2 2​ 个连通块;否则,连通块数量不改变。

了解状态转移方程后即可从前往后遍历得出。

此解法时间复杂度为 O ( n k ) \mathcal O(nk) O(nk)

Solution

import sys
input = lambda: sys.stdin.readline().strip()
mod = 998244353

n, k = map(int, input().split())
"""
dp[i][j][k] 表示前 i 列形成 j 个连通块,方案为 k
k = 0,两个白块
k = 1,上白下黑
k = 2,上黑下白
k = 3,两个黑块
"""
dp = [[[0 for _ in range(4)] for _ in range(2 * n + 1)] for _ in range(n + 1)]
dp[1][1][0] = dp[1][2][1] = dp[1][2][2] = dp[1][1][3] = 1
for i in range(2, n + 1):
    for j in range(i * 2 + 1):
        dp[i][j][0] = (dp[i - 1][j][0] + dp[i - 1][j][1] + dp[i - 1][j][2] + dp[i - 1][max(j - 1, 0)][3]) % mod
        dp[i][j][1] = (dp[i - 1][max(j - 1, 0)][0] + dp[i - 1][j][1] + dp[i - 1][max(j - 2, 0)][2] + dp[i - 1][max(j - 1, 0)][3]) % mod
        dp[i][j][2] = (dp[i - 1][max(j - 1, 0)][0] + dp[i - 1][max(j - 2, 0)][1] + dp[i - 1][j][2] + dp[i - 1][max(j - 1, 0)][3]) % mod
        dp[i][j][3] = (dp[i - 1][max(j - 1, 0)][0] + dp[i - 1][j][1] + dp[i - 1][j][2] + dp[i - 1][j][3]) % mod
print(sum(dp[n][k][i] for i in range(4)) % mod)
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值