题目链接

\(Description\)

给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数。

\(2\leq n\leq 2000,\quad 1\leq k\leq n-1\)。

\(Solution\)

容斥。则\(Ans=\sum_{i=0}^n(-1)^ig(i)(n-i)!\),其中\(g(i)\)为至少有\(i\)个位置满足\(|a_i-i|=k\)的排列数。

考虑如何计算\(g(x)\)。每个\(i\)向\(i+k\)和\(i-k\)连边,可以得到一张二分图,\(g(x)\)就是在这张二分图上选\(x\)个匹配的方案数。

我们还可以发现,图中的匹配形成了\(2k\)条互不相交的链,且每条链上的数模\(k\)相同(也就是模\(k\)不同的数是互不影响的,所以枚举模数就可以得到所有链了)。

如果只有一条长\(l\)的链,那么就是对\(l-1\)个点DP,\(f[i][j][0/1]\)表示当前第\(i\)个点,已经选了\(j\)个匹配,这个点选不选(这个点选要求上一个点没选)。

对于\(2k\)条链也是一样的,只要在链之间加一个点,并强制它不能选(\(f[i][j][1]=0\)),就可以把这些链合在一起DP啦。

这样复杂度\(O(n^2)\),然而好多dalao用NTT\(n\log n\)过掉了orz。


因为想跑快点(个人习惯)写的有点乱,代码也可以看他的:http://www.cnblogs.com/wxjor/p/9476998.html。

//20ms	256KB
#include <cstdio>
#include <algorithm>
#define mod 924844033
typedef long long LL;
const int N=4005;//2n int ban[N],f[2][N][2],fac[N]; int main()
{
int n,K,cnt=0; scanf("%d%d",&n,&K);
for(int i=1; i<=K; ++i)
{
ban[++cnt]=1;
for(int j=i+K; j<=n; j+=K) ban[++cnt]=0;
ban[++cnt]=1;//就是两条链啊
for(int j=i+K; j<=n; j+=K) ban[++cnt]=0;
}
int p=0; f[p][0][0]=1;
for(int i=0; i<cnt; ++i,p^=1)
for(int j=0; j<=i; ++j)
{
f[p^1][j][0]=(f[p][j][0]+f[p][j][1])%mod;
if(!ban[i+1]) f[p^1][j+1][1]=f[p][j][0];
f[p][j][0]=f[p][j][1]=0;
}
fac[0]=1;
for(int i=1; i<=n; ++i) fac[i]=1ll*fac[i-1]*i%mod;
LL ans=0;
for(int i=0; i<=n; ++i)
ans+=i&1?mod-1ll*fac[n-i]*(f[p][i][0]+f[p][i][1])%mod:1ll*fac[n-i]*(f[p][i][0]+f[p][i][1])%mod;
printf("%lld\n",ans%mod); return 0;
}

AGC 005D.~K Perm Counting(容斥 DP 二分图)的更多相关文章

  1. AGC 005 D - ~K Perm Counting

    D - ~K Perm Counting 链接 题意: 求有多少排列对于每个位置i都满足$|ai−i|!=k$.n<=2000 分析: 容斥+dp. $answer = \sum\limits_ ...

  2. [Agc005D]K Perm Counting

    [Agc005D] K Perm Counting Description 糟糕爷特别喜爱排列.他正在构造一个长度为N的排列.但是他特别讨厌正整数K.因此他认为一个排列很糟糕,当且仅当存在至少一个i( ...

  3. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  4. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  5. BZOJ3622(容斥+dp)

    思路 "恰k个"考虑求至少k.k+1--个容斥 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为\((n+k)/2\)的方案数 \(f[i][j]\)数组我觉得更好的理解方 ...

  6. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  7. $bzoj2560$ 串珠子 容斥+$dp$

    正解:容斥+$dp$ 解题报告: 传送门$QwQ$ $umm$虽然题目蛮简练的了但还是有点难理解,,,我再抽象一点儿,就说有$n$个点,点$i$和点$j$之间有$a_{i,j}$条无向边可以连,问有多 ...

  8. [AGC005D] ~K Perm Counting [dp]

    题面 传送门 思路 首先可以明确的一点是,本题中出现不满足条件的所有的数,都是分组的 只有模$K$意义下相同的数之间才会出现不满足条件的情况,而且仅出现在相邻的情况 那么我们考虑把这个性质利用起来 我 ...

  9. 【XSY3156】简单计数II 容斥 DP

    题目大意 定义一个序列的权值为:把所有相邻的相同的数合并为一个集合后,所有集合的大小的乘积. 特别的,第一个数和最后一个数是相邻的. 现在你有 \(n\) 种数,第 \(i\) 种有 \(c_i\) ...

随机推荐

  1. 基于kali linux无线网络渗透测试

    1.无线网络渗透测试目前主要有三种方式,分别是暴力破解PIN码,跑握手包,搭建伪热点三种方式,当然还存在其他的方式. 1.1暴力破解 路由器的PIN码由八位0-9的数字组成,PIN码由散步风组成,前四 ...

  2. bzoj 2150

    然后考虑正解 我们发现,最坏情况就是每个点都派驻军队,所以答案至多是“.”的数目 而且,每个点都至多只有一个入度和一个出度,所以我们可以将每个点拆成两个点,一个作为入点,一个作为出点,然后所有图上能到 ...

  3. js中onload和jQuery中的ready区别

    window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. ------>不能写多个(如果有多个,只会执行一个) $(document).ready()是DOM结构绘制完毕后 ...

  4. shell之ulimit应该注意的事项

    详细介绍:http://www.cnblogs.com/xiaOt119/archive/2012/06/13/2547930.html ulimit -n 2048 1.这个限制是针对单个程序的限制 ...

  5. js 浮点数相加 变成字符串 解决方案

    var count = 0; count+=Number(parseFloat(value[i]['sla']).toFixed(2)); 数字相加的时候最好使用Number转换一下

  6. Python深度学习案例2--新闻分类(多分类问题)

    本节构建一个网络,将路透社新闻划分为46个互斥的主题,也就是46分类 案例2:新闻分类(多分类问题) 1. 加载数据集 from keras.datasets import reuters (trai ...

  7. 从零开始学C#——不再更新,直接进入高阶教程

    从零开始学习C#不再更新,直接进入高阶教程. 入门教程,请自行谷歌.百度吧,有很多这样的教程. 编程是一件实践性很强的事情,那么接下来的文章将开始进行开发项目. 还在编程中迷茫的人们,先暂时放下一切的 ...

  8. golang ffmpeg 做网络直播

    最近在公司做在线视频转码的工作,研究了下ffmpeg 最后直接研究了下网络直播,我是在我自己的mac 上面测试的,效果,还可以,先看看效果图吧 ffmpeg 我是通过brew安装 的,这步就略了 VL ...

  9. MVC异常处理(异常捕获)

    1.cshtml页面异常 2.Controller异常 3.路由参数异常. 4.页面不存在404 页面不存在404,可以通过配置config来处理 <customErrors mode=&quo ...

  10. Git和Github入门教程

    一.常用命令 所有命令前都要加 git,如表中的init是指 git init.点击命令可直接跳转至本文第一次使用的地方.以下命令都在命令行里执行. 1.本地命令 行为 命令 备注 初始化 init ...