codeforces 1027 E. Inverse coloring (DP)
2 seconds
256 megabytes
standard input
standard output
You are given a square board, consisting of $$$n$$$ rows and $$$n$$$ columns. Each tile in it should be colored either white or black.
Let's call some coloring beautiful if each pair of adjacent rows are either the same or different in every position. The same condition should be held for the columns as well.
Let's call some coloring suitable if it is beautiful and there is no rectangle of the single color, consisting of at least $$$k$$$ tiles.
Your task is to count the number of suitable colorings of the board of the given size.
Since the answer can be very large, print it modulo $$$998244353$$$.
A single line contains two integers $$$n$$$ and $$$k$$$ ($$$1 \le n \le 500$$$, $$$1 \le k \le n^2$$$) — the number of rows and columns of the board and the maximum number of tiles inside the rectangle of the single color, respectively.
Print a single integer — the number of suitable colorings of the board of the given size modulo $$$998244353$$$.
1 1
0
2 3
6
49 1808
359087121
Board of size $$$1 \times 1$$$ is either a single black tile or a single white tile. Both of them include a rectangle of a single color, consisting of $$$1$$$ tile.
Here are the beautiful colorings of a board of size $$$2 \times 2$$$ that don't include rectangles of a single color, consisting of at least $$$3$$$ tiles:

The rest of beautiful colorings of a board of size $$$2 \times 2$$$ are the following:

当同时知道了行的0/1序列和列的0/1序列,只要再知道矩阵任何一个方格的颜色,就能唯一的表示一个矩阵了。
观察发现,同一种颜色的区域都是矩形,而且它们的大小来自于行和列上连续的0或1。如果把行和列的序列连续的0/1的个数记录下来,比如上面的例子中,行是2,3,3,列是1,2,2,1,2,我们就得到了两个新的序列,并且两个序列的数相乘就是所有色块的面积。

自然想到,行中最大的数乘以列中最大的数小于k就是充分必要条件,于是转而分析序列的最大值。
不难发现,序列的最大值可以从1取到n,如果已经知道最大值分别为1,2,3,..n的序列的个数,那么我们只需要让两个序列的最大值两两匹配,遍历所有乘积小于k的情况,就能求出总方案个数。
接下来的问题就是怎么取求最大值分别为1,2,3,..n的序列的个数,也就是说需要解决怎么求最大值为m,和为n的序列的个数。
假设用$$$(n,m)$$$代表最大值为$$$m$$$和为$$$n$$$的任意序列$$$a_1,a_2,...,a_t$$$,注意序列每个数字其实是有颜色的,那么总可以在$$$a_1$$$前面,添加一个颜色相反的数字$$$a_0$$$,如果它不大于$$$m$$$,那么就得到了一个$$$(n+a_0,m)$$$,按照这个思路,如果用$$$dp[n][m]$$$表示序列的个数,可以构造出状态转移方程:
$$$dp[n][m]=dp[n-1][m]+dp[n-2][m]+...+dp[n-m][m]$$$
含义就是$$$(n,m)$$$可以通过在$$$(n-1,m)$$$前面添加$$$1$$$,$$$(n-2,m)$$$前面添加$$$2$$$,...,的方法得到。
注意到一件事,$$$dp[n][m]$$$,当$$$n$$$小于等于$$$m$$$的时候,含义就是和为$$$n$$$的序列,且没有任何限制,那么个数就是$$$2^n$$$
所以状态转移方程就是:
$$$$$$dp[n][m]=
\begin{cases}
\sum_{i=1}^{m} dp[n-i][m], & {n\gt m} \\[2ex]
2^n, & {n\le m}
\end{cases}
$$$$$$
进一步发现,对于$$$n>m$$$的部分
$$$$$$\begin{align}
dp[n][m] &=dp[n-1][m]+dp[n-2][m]+...+dp[n-m][m]\\
&=dp[n-1][m]+(dp[n-1][m]-dp[n-m-1][m])\\
&=2*dp[n-1][m]-dp[n-m-1][m]
\end{align}$$$$$$
所以最终的状态转移方程就是:
$$$$$$dp[n][m]=
\begin{cases}
2*dp[n-1][m]-dp[n-m-1][m], & {n\gt m} \\[2ex]
2^n, & {n\le m}
\end{cases}
$$$$$$
#include<stdio.h>
typedef long long LL;
#define mod 998244353
int dp[][];
#define min(a,b) ((a)<(b)?(a):(b))
inline void add(int &a, int b) { a += b; if (a>mod)a -= mod; if (a<)a += mod; } void init() {
int temp;
dp[][] = ; dp[][] = ;
for (int t = ; t <= ; ++t) {
dp[t][t] = (dp[t - ][t - ] << ) % mod;
dp[][t] = ;
}
for (int k = ; k <= ; ++k) {
for(int n=;n<=k;++n){
dp[n][k] = dp[n][n];
}
for (int n = k + ; n <= ; ++n) {
dp[n][k] = (*dp[n-][k]%mod-dp[n-k-][k]+mod)%mod;
}
}
} int main() {
int n, k;
init();
scanf("%d %d", &n, &k);
int ans = ;
LL help;
for (int i = ; i <= n; ++i) {
help = dp[n][i] - dp[n][i - ];
help = help*(dp[n][min((k - ) / i,n)]) % mod;
add(ans, help);
}
ans = (ans<<) % mod;
printf("%d\n", ans);
}
codeforces 1027 E. Inverse coloring (DP)的更多相关文章
- Codeforces 1027E Inverse Coloring 【DP】
Codeforces 1027E Inverse Coloring 题目链接 #include<bits/stdc++.h> using namespace std; #define N ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- 【CF1027E】Inverse Coloring(DP)
题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于 ...
- codeforces 1027E. Inverse Coloring(计数)
一开始发现的性质是确定了第一行后,后面的行只需要考虑和前面的行相同或者不同,整个过程只需要考虑行,构出的图一定符合性质(即同样满足列的性质),但是接下来死活定义不出状态,事实证明自己还是想的太少了 思 ...
- codeforces 721C (拓排 + DP)
题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知 ...
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- Codeforces 543D. Road Improvement (树dp + 乘法逆元)
题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...
- Codeforces 467C. George and Job (dp)
题目链接:http://codeforces.com/contest/467/problem/C 求k个不重叠长m的连续子序列的最大和. dp[i][j]表示第i个数的位置个序列的最大和. 前缀和一下 ...
- Codeforces 706 C. Hard problem (dp)
题目链接:http://codeforces.com/problemset/problem/706/C 给你n个字符串,可以反转任意一个字符串,反转每个字符串都有其对应的花费ci. 经过操作后是否能满 ...
随机推荐
- 优步uber司机常见问题与答案(成都地区官方)
成都地区优步司机常见问题,官方内容,有点多,常出现的问题都收录在这里了,大家可以看看.(注:文章转自官方,非原创) 以下为成都优步合作车主最常见的问题列表和答案.对于绝大多数的车主端问题,您都可以在下 ...
- MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 的解决方法
解决方法如下: 方法 1.在线修改提高允许的max_connection_errors数量: A. 登录Mysql数据库查看max_connection_errors: mysql>show ...
- Objective-C 方法交换实践(一) - 基础知识
一.Objective-C 中的基本类型 首先看下 Objective-C 的对象模型,每个 Objective-C 对象都是一个指向 Class 的指针.Class 的结构如下: struct ob ...
- Maven学习(二)-----Maven启用代理访问
Maven启用代理访问 如果你的公司正在建立一个防火墙,并使用HTTP代理服务器来阻止用户直接连接到互联网.如果您使用代理,Maven将无法下载任何依赖. 为了使它工作,你必须声明在 Maven 的配 ...
- activeX 打包
原文 http://www.docin.com/p-409284488.html CAB打包文档说明 文档目的 本文档的目的在于说明将ocx和dll以及相关的文件打包成一个CAB包,以便在网页下调用o ...
- pytest使用笔记(一)
使用环境及预置条件:pycharm+win10+python3.6+pytest 1,创建示范的测试功能脚本,另存为test_sample.py,代码如下: # test_sample.py def ...
- Appium+python的单元测试框架unittest(4)——断言(转)
(原文:https://www.cnblogs.com/fancy0158/p/10051576.html) 在我们编写的测试用例中,测试步骤和预期结果是必不可少的.当我们运行测试用例时,得到一个运行 ...
- 随身Wifi+win7 搭建http代理 域名劫持 抓包 内容篡改实验环境
需求来源: 1.平板或手机是个封闭系统无法给wifi设置代理 2.需要利用filllder进行抓包,内容篡改等实验 拥有硬件资源:PC机器 + 小米随身wifi 方案1: NtBind Dns + N ...
- 译 - Cassandra 数据建模的基本规则
Basic Rules of Cassandra Data Modeling 原文地址:http://www.datastax.com/dev/blog/basic-rules-of-cassandr ...
- python正则表达式中含有变量的写法
使用格式化字符串的方式实现举例: re.findall("(this,%s,'(.*?)'"%str(i),"abcd(this,1,'123123)')这里i为变量