Bicolorings CodeForces - 1051D (DP)

You are given a grid, consisting of 22 rows and nn 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 AA and BB belong to the same component if they are neighbours, or if there is a neighbour of AA that belongs to the same component with BB.

Let's call some bicoloring beautiful if it has exactly kk components.

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

Input

The only line contains two integers nn and kk (1≤n≤10001≤n≤1000, 1≤k≤2n1≤k≤2n) — the number of columns in a grid and the number of components required.

Output

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

Examples

Input

3 4

Output

12

Input

4 1

Output

2

Input

1 2

Output

2

Note

One of possible bicolorings in sample 11:

题意:给你一个2行n列的矩阵,每个格子可以染黑白两种颜色,问染成恰好k个连通域有几种方法,结果最后%998244353

设一个dp[i][j][k]

表示到第i列组成j个连通域第i列为k种状态时的方法数,,k=0表示第i列的颜色相同,k=1表示第i列的颜色不同

这样转移方程就好写了

上面四种情况是:dp[i][j][0]+=dp[i-1][j][1]*2;

这两种情况是:dp[i][j][0]+=dp[i-1][j][0];

这两种情况是:dp[i][j][0]+=dp[i-1][j-1][0];

这四种情况是:dp[i][j][1]+=dp[i-1][j-1][0]*2;

这两种是dp[i][j][1]+=dp[i-1][j-2][1];

这两种是:dp[i][j][1]+=dp[i-1][j][1];

详见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#define pb push_back
#define INF 0x3f3f3f3f

using namespace std;
const int maxn=1e5+5;
typedef long long ll;
const ll mod=998244353;
ll dp[1005][2005][2],n,m;
int main()
{
    scanf("%lld%lld",&n,&m);
    memset(dp,0,sizeof(dp));
    dp[1][1][0]=2;
    dp[1][2][1]=2;
    for(int i=2;i<=n;i++)
    for(int j=1;j<=m;j++) {
        dp[i][j][0]=(dp[i][j][0]+2*dp[i-1][j][1]+dp[i-1][j][0]+dp[i-1][j-1][0])%mod;
        dp[i][j][1]=(dp[i][j][1]+dp[i-1][j-1][0]*2+dp[i-1][j][1]+dp[i-1][j-2][1])%mod;
    }
    printf("%lld\n",(dp[n][m][0]+dp[n][m][1])%mod);
    return 0;
}

 

全部评论

相关推荐

07-11 15:12
门头沟学院 Java
别人在上班,我就在工位上看看视频啥的,这正常吗?
程序员小白条:实习就是摸鱼,只是公司指标,把你进来了,可能那时候客户很多,但等你进来的时候,已经是淡季了,根本没多少需求,或者说根本不适合实习生去完成,因此你就每天干坐着就行,可能1,2个月都没需求
实习生的蛐蛐区
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 18:05
哈哈哈哈哈感觉朋友找工作的已经疯掉了,直接上图
码农索隆:真老板娘:“我嘞个去,这不我当年的套路吗
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 14:00
不想多说了,什么逆天HR,还要教我礼貌😂
机械打工仔:这不纯傻卵吗,他还操心上别人老板了
投递BOSS直聘等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务