博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【agc005d】~K Perm Counting
阅读量:4982 次
发布时间:2019-06-12

本文共 930 字,大约阅读时间需要 3 分钟。

题目大意

求有多少中1~n的排列,使得\(abs(第i个位置的值-i)!=k\)

解题思路

考虑容斥,\(ans=\sum_{i=0}^{n}(-1)^ig[i](n-i)!(g[i]表示至少有i个位置是不合法的方案数)\)

考虑如何求g[i]
将每个位置和每个值都作为一个点,有2n个点,如果第i位置不可以填j,将位置i向值j连边。
这样,就得到了一个二分图,问题就变成了选i条边的方案数。
将二分图的每条链拉出来,并在一起,就形成2n个点排成一排,一些相邻点之间有边。
\(f[i][j][0/1]\)表示,做到第i个点,选了j条边,这个点与上个一点的边是否有选(如果没边就为0)的方案数。
那么\(g[i]=f[2n][i]][0]+f[2n][i][1]\)

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
const int inf=2147483647;const int mo=924844033; const int N=4005;using namespace std;int n,m,tot;bool lk[N];long long f[N][N][2],jc[N],ans;int main(){ scanf("%d%d",&n,&m); jc[0]=1; for(int i=1;i<=n;i++) jc[i]=1ll*jc[i-1]*i%mo; for(int i=1;i<=m;i++) for(int t=2;t--;) for(int j=i;j<=n;j+=m) { tot++; if(j!=i) lk[tot]=1; } f[0][0][0]=1; for(int i=0;i

转载于:https://www.cnblogs.com/chen1352/p/9099522.html

你可能感兴趣的文章
省选专练POI2015Logistyka
查看>>
CCPC2016合肥现场赛
查看>>
layui 框架之秒传文件 (前端分段 MD5 型成秒传)
查看>>
Asp.net 在刷新或提交页面后保持滚动条的位置
查看>>
JVM类加载原理学习笔记
查看>>
浏览器-02 Chromium的多线程
查看>>
git如何查找某文件中每一行的修改情况?
查看>>
linux下的下载之道
查看>>
go语言中strings包中的Trim函数的作用是什么
查看>>
C#知识点提要
查看>>
PageRank之基于C和C#的基本实现
查看>>
WPF MvvmLight RelayCommand 绑定Command 的使用
查看>>
vs2013新建asp.net web 项目报错,此模板尝试加载组件程序集NuGet Package Manage
查看>>
Finding Team Member
查看>>
Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File
查看>>
Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
查看>>
Selenium-ActionChainsApi接口详解
查看>>
UI进阶
查看>>
java.io.Serializable 序列化接口
查看>>
asp.net get中文传值乱码
查看>>