[AGC005D] ~K Perm Counting

news/2024/11/13 11:08:45/文章来源:https://www.cnblogs.com/cxqghzj/p/18540373

题意

求对于所有的 \(i\) 满足 \(|P_i - i| \neq k\),的排列数量,对 \(924844033\) 取模。

\(2 \le n \le 2 \times 10 ^ 3, 1 \le k \le n - 1\)

Sol

考虑转成 \(n \times n\) 的网格图,那么就是所有 \((i, i + k)\) 以及 \((i, i - k)\) 的格子涂黑不能用。

题意转化为在网格图里放 \(n\) 个车,不能放在黑格子里,互相不攻击的方案数。

考虑尝试把这个限制容斥掉,设 \(f(x)\) 表示我们钦定在黑色格子里放 \(x\) 个车的方案数。

那么答案就是:

\[\sum \sum_{i = 0} ^ n (-1) ^ i f(i) (n - i)! \]

如何计算 \(f\)?注意到我们将每行每列的黑格子连起来,然后就变成了若干条链,不能选择链上相邻的点,直接在链上 \(\texttt{dp{\) 即可。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <bitset>
#include <vector>
using namespace std;
#ifdef ONLINE_JUDGE#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;#endif
int read() {int p = 0, flg = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-') flg = -1;c = getchar();}while (c >= '0' && c <= '9') {p = p * 10 + c - '0';c = getchar();}return p * flg;
}
void write(int x) {if (x < 0) {x = -x;putchar('-');}if (x > 9) {write(x / 10);}putchar(x % 10 + '0');
}
bool _stmer;const int N = 4e3 + 5, M = 8e6 + 5, mod = 924844033;array <array <array <int, 2>, N>, N> f;void Mod(int &x) {if (x >= mod) x -= mod;if (x < 0) x += mod;
}namespace Uni {array <int, M> fa;int find(int x) {if (x == fa[x]) return x;return fa[x] = find(fa[x]);
}void merge(int x, int y) {int fx = find(x),fy = find(y);if (fx == fy) return;fa[fy] = fx;
}void init(int n) {for (int i = 1; i <= n; i++)fa[i] = i;
}} //namespace Uniint getid(int x, int y) { return (x - 1) * ((int)4e3) + y; }array <bitset <N>, N> vis;
array <int, M> siz;bool _edmer;
int main() {cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";int n = read(), k = read();Uni::init(8e6);for (int i = 1; i <= n; i++) {if (i + k <= n) vis[i][i + k] = 1;if (i - k > 0) vis[i][i - k] = 1;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (!vis[i][j]) continue;if (i + 2 * k <= n && vis[i + 2 * k][j])Uni::merge(getid(i, j), getid(i + 2 * k, j));if (j + 2 * k <= n && vis[i][j + 2 * k])Uni::merge(getid(i, j), getid(i, j + 2 * k));}}for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)if (vis[i][j])siz[Uni::find(getid(i, j))]++;vector <int> isl;for (int i = 1; i <= 8e6; i++)if (siz[i]) isl.push_back(siz[i]);
#define upd(x, y) (x += y, Mod(x))f[0][0][0] = 1;int lst = 0;for (auto p : isl) {for (int i = lst + 1; i <= lst + p; i++) {for (int j = n; ~j; j--) {upd(f[i][j][0], f[i - 1][j][0]);upd(f[i][j][0], f[i - 1][j][1]);if (j)upd(f[i][j][1], f[i - 1][j - 1][0]);}}lst += p;for (int i = 1; i <= n; i++)upd(f[lst][i][0], f[lst][i][1]), f[lst][i][1] = 0;}int ans = 0, res = 1;for (int i = n; ~i; i--) {ans += ((i & 1) ? -1ll : 1ll) * (f[lst][i][0] + f[lst][i][1]) * res % mod, Mod(ans);res = 1ll * res * (n - i + 1) % mod;}write(ans), puts("");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA-idea激活

通过百度网盘分享的文件:IDEA激活工具 链接:https://pan.baidu.com/s/18QIqrMVE4ScNhBjhwde_7Q 提取码:sky1二、重启电脑

说明与笔记导航

对使用这些笔记的同学想说的话,以及更新进度。为什么写这么多B东西? 其一呢是帮助我自己,边写笔记边梳理知识;其二呢是帮助各位义父义母考试成功。 更新进度与内容说明 11.11:本周工作日需突击学习python,计划今晚更新有限体积法剩余部分。 目前进度:3009 建模:数值方法…

鸿蒙NEXT开发案例:指尖轮盘

【1】引言 “指尖轮盘”是一个简单而有趣的互动游戏(类似抓阄),这个应用通过触摸屏幕的方式,让玩家参与一个激动人心的游戏,最终选出幸运的赢家。未来可以进一步扩展功能,如增加游戏模式、优化动画效果、增加音效等,提升用户体验。 【2】环境准备 电脑系统:windows 10 …

antD——Warning: `callback` is deprecated. Please return a promise instead.

参考: 1. https://blog.csdn.net/huochai770880/article/details/125925665我的情况 antD表单校验,代码未报错,但提交时控制台报错:Warning: `callback` is deprecated. Please return a promise instead.原报错代码:const validateParams = useCallback((_: RuleObject, …

Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗

最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪的 BUG: 可以看到,当 `ComboBox` 嵌入 `Popup` 时,点开 `ComboBox`,然后滚动内容超过其可见区域并不会关闭 `ComboBox` 弹窗,并且会超出其 `父 Popup` 范围。【写在前面】 最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪…

【Cytoscape 3.10软件下载与安装教程】

1、安装包 Cytoscape3.10: 链接:https://pan.quark.cn/s/0fc00372f3a4 提取码:styP Cytoscape3.9 链接:https://pan.quark.cn/s/f2747b32fe54 提取码:ean2 Cytoscape3.8: 链接:https://pan.quark.cn/s/c6092262f108 提取码:24G6 Cytoscape3.7: 链接:https://pan.qua…

max 函数与 min 函数相关

max 函数与 min 函数相关前情概要 只要有两个实数,就会涉及能大小比较的问题,那么只要有两个函数,自然也会涉及能大小比较的问题,比如我们熟悉的两个简单函数 \(y=2x+1\) 和 \(y=-x+1\),做出两个函数的图象如下,从图象可以看出,当 \(x<0\) 时,\(g(x)>f(x)\);当 …

kafka监控

kafka监控部署 kafka使用Prometheus、Grafana和kafka_exporter来构建kafka指标监控 问题背景 在实时场景下,对于数据积压是很常见的,我们更希望如何去快速知道有没有数据积压,目前消费了多少,速度怎么样,趋势如何。可以使用原生命令kafka-consumer-groups.sh --bootstrap-…

实景三维赋能地灾风险管控

在当今社会,随着城市化进程的加速以及工业化的发展,地质灾害成为了威胁人们生命财产安全的重要因素之一。特别是在全球气候变化的背景下,极端天气事件的增多导致地质灾害的发生频率和强度都有所上升。因此,如何有效地进行地质灾害的风险管控,成为当前亟待解决的问题之一。…

20222301 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: ①DNS注册人及联系方式 ②该域名对应IP地址 ③IP地址注册人及联系方式 ④IP地址所在国家、城市和具体地理位置 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并…

高级语言程序设计作业 11/11

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400215 姓名:胡加乘1 #include <iostream>using namespace std;#define ROWS 3 #define COLS 5i…

win 11 开发板,windows,ubuntu虚拟机网络互通

确保在同一个网段里面就行 如果ping开发板不通,将win防火墙关闭了试一试 虚拟机使用桥接模式,桥接到正确的网卡上,此处使用的是usb网卡 编辑->虚拟机网络编辑器ubuntu手动设置桥接的网卡信息此处ens32是桥接的网卡 ens33是NAT网卡windows也是同样设置,注意网段保持一致虚拟机…