CS academy Binary Flips(dp)
开学啦,没啥时间写博客。。过几天就能又停课啦qwq
做点中等 \(dp\) 题来找找
noip的感觉 233
题意
给你一个 \(n \times m\) 的矩阵 \(A\) ,一开始全是 \(0\) 。
然后你可以对这个矩阵进行 \(k\) 次操作:
- 每次选择一个宫格 \((i, j)\) ,将第 \(i\) 行和第 \(j\) 列的状态翻转。(注意 \((i, j)\) 这个点的状态翻转两次然后不会改变)
问最后使得 \(A\) 中恰好有 \(S\) 个宫格被染黑的方案数。
\(1 \le n, m, k \le 3000\)
题解
思路很简单,首先我们考虑最后如果有 \(a\) 行被染了奇数次, \(b\) 列被染了奇数次,那么最后被染黑(变成 \(1\) )的格子数就是 \(a * m + b * n - 2 * a * b\) 。
我们可以暴力枚举 \(a, b\) 然后判断它得到面积是否为 \(S\) 。
然后我们就要考虑计算一个数,表示 \(k\) 次操作后,恰好有 \(a\) 行且 \(b\) 列被染黑的方案数。
我们很容易发现行和列的方案是互不影响的,然后我们可以考虑计算 \(k\) 次操作后,恰好有 \(a\) 行是染黑的方案数。
这个很显然可以用一个 \(dp\) 来计算,令 \(f_{i, j}\) 表示第 \(i\) 次操作后,恰好有 \(j\) 行染黑的方案数。
\]
这个转移意义十分的显然(就是忽略每行的区别,直接计算有几种方案使得它发生变化)
对与列的 \(dp\) 也是一样的。 然后就能很轻松的做完啦qwq
复杂度是 \(O(k(n + m) + nm)\) 的。
总结
忽略一些表面上的区别,把本质相同的当做一个状态去转移就行了。
后记
我总认为这个题可以把 \(n, m, k\) 出到 \(10^5\) 乃至 \(10^6\) 。
对于 \(a, b\) 的枚举,我们可以单枚举一个,然后快速算出另外一个。(因为是一次函数,所以一一对应)
然后瓶颈就在求那个每行的方案数上了。
那个应该可以用生成函数等高端计数技巧来进行优化,目前我还没有找出规律qwq
其实可以用线性代数魔法优化到 \(O(n \log n \log k)\) ,就是特征多项式用 \(NTT\) 转移即可。
代码
#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
typedef long long ll;
inline bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
inline bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;}
inline int read() {
int x = 0, fh = 1; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
return x * fh;
}
const int N = 3e3 + 1e2, Mod = 1e9 + 7;
void File() {
#ifdef zjp_shadow
freopen ("binary-flips.in", "r", stdin);
freopen ("binary-flips.out", "w", stdout);
#endif
}
ll dpn[N][N], dpm[N][N];
int main () {
File();
for (int cases = read(); cases; -- cases) {
int n = read(), m = read(), k = read(), s = read();
dpn[0][0] = 1;
For (i, 1, k) {
For (j, 1, i)
dpn[i][j] = (dpn[i - 1][j + 1] * (j + 1) + dpn[i - 1][j - 1] * (n - j + 1)) % Mod;
dpn[i][0] = dpn[i - 1][1];
}
dpm[0][0] = 1;
For (i, 1, k) {
For (j, 1, i)
dpm[i][j] = (dpm[i - 1][j + 1] * (j + 1) + dpm[i - 1][j - 1] * (m - j + 1)) % Mod;
dpm[i][0] = dpm[i - 1][1];
}
int ans = 0;
For (a, 0, k) if ((k & 1) == (a & 1)) For (b, 0, k) if ((k & 1) == (b & 1) && a * m + b * n - 2 * a * b == s) {
ans = (ans + dpn[k][a] * dpm[k][b]) % Mod;
}
printf ("%d\n", ans);
}
return 0;
}
CS academy Binary Flips(dp)的更多相关文章
- 【gym102394B】Binary Numbers(DP)
题意:From https://blog.csdn.net/m0_37809890/article/details/102886956 思路: 可以发现转移就是右上角的一个区间前缀和 std只要开1倍 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【CF662C】Binary Table(FWT)
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
随机推荐
- Linux安装Apache常见报错(二)
配置Apache提示报错configure error: APR could not be located. Please use the --with-apr option. 解决办法: ./con ...
- php 简单的学习GD库绘制图片并传回给前端实现方式
1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...
- YCSB报": No such file or directory"异常
异常信息如下: 文件路径.权限都没有问题. 上网遍寻无果,安装流程与官网一致,开始怀疑是环境问题,后来用别人能用的YCSB复制到本地,却能正常运行. 后来修改了ycsb文件,加了个空格,保存退出,再运 ...
- Git使用过程中的问题
Q-1:怎么切换到远程的分支 本地已经有一个代码库了(是从github上clone的),但是现在远程库中一个新的branch,怎么拉取远程分支,并在本地创建该分支(内容一样).how to do? # ...
- HTTL之初印象
概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...
- TextView不用ScrollViewe也可以滚动的方法
转自:http://www.jb51.net/article/43377.htm android TextView不用ScrollViewe也可以滚动的方法. TextView textview = ...
- Spirng boot maven多模块打包不踩坑
本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340 经过实战一次通过.回话不多说,话费不多说,直接上图. 项目整体结构: 父模块: ...
- Django--cookie 和 session
一 . 会话跟踪 简单来说就是如果谢霆锋登录了淘宝,然后他点击淘宝内的任何连接就不需要在登录了,这是由于这个会话中数据共享, 也就是会话跟踪, 我们都知道http协议是短连接 无状态的,也就是说你登录 ...
- Data Structures & js &ES 6 & ES next
Data Structures & js &ES 6 & ES next Algorithm Singly-Linked List & Doubly-Linked Li ...
- 21.PHP实现Word/Excel/PPT转换为PDF
参考文档: https://www.cnblogs.com/woider/p/7003481.html http://blog.csdn.net/aoshilang2249/article/detai ...