题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k。

Solution

直接dp会有很大的后效性。

所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1][0/1]表示前i个数,填了j个数,当前位置有没有被选,下一位有没有被选,这样做的话,转移会比较简单。

那么除去这j个数,剩下的数随便填,乘上全排列就好了。

但这样会多算。

然后这种问题有一个容斥模型,直接套上就好了。

#include<iostream>
#include<cstdio>
#define N 1002
using namespace std;
typedef long long ll;
int n,k;
ll dp[N][N][][],jie[N],ni[N],g[N],ans;
const int mod=1e9+;
ll calc(int n,int m){
return jie[n]*ni[m]%mod*ni[n-m]%mod;
}
ll power(ll x,int y){
ll ans=;
while(y){
if(y&)(ans*=x)%=mod;
(x*=x)%=mod;
y>>=;
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);jie[]=;
for(int i=;i<=n;++i)jie[i]=(jie[i-]*i)%mod;ni[n]=power(jie[n],mod-);
for(int i=n-;i>=;--i)ni[i]=ni[i+]*(i+)%mod;
dp[][][][]=;
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
dp[i][j][][]=(dp[i-][j][][]+dp[i-][j][][])%mod;
dp[i][j][][]=(dp[i-][j][][]+dp[i-][j][][])%mod;
if(j){
(dp[i][j][][]+=dp[i-][j-][][])%=mod;
dp[i][j][][]+=(dp[i-][j-][][]+dp[i-][j-][][])%mod;
dp[i][j][][]%=mod;
(dp[i][j][][]+=dp[i-][j-][][])%=mod;
dp[i][j][][]+=(dp[i-][j-][][]+dp[i-][j-][][])%mod;
dp[i][j][][]%=mod;
}
}
}
for(int i=k;i<=n;++i)
g[i]=(dp[n][i][][]+dp[n][i][][])%mod*jie[n-i]%mod;
for(int i=k;i<=n;++i)(ans+=(((i-k)&)?-:)*calc(i,k)*g[i]%mod+mod)%=mod;
ans=(ans+mod)%mod;
cout<<ans;
return ;
}

CF285E Positions in Permutations(dp+容斥)的更多相关文章

  1. 【做题】CF285E. Positions in Permutations——dp+容斥

    题意:求所有长度为\(n\)的排列\(p\)中,有多少个满足:对于所有\(i \,(1 \leq i \leq n)\),其中恰好有\(k\)个满足\(|p_i - i| = 1\).答案对\(10^ ...

  2. 【CF715E】Complete the Permutations(容斥,第一类斯特林数)

    [CF715E]Complete the Permutations(容斥,第一类斯特林数) 题面 CF 洛谷 给定两个排列\(p,q\),但是其中有些位置未知,用\(0\)表示. 现在让你补全两个排列 ...

  3. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  4. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  5. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  6. CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)

    Permutation p is an ordered set of integers p1,  p2,  ...,  pn, consisting of n distinct positive in ...

  7. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  8. Codeforces 611C New Year and Domino DP+容斥

    "#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...

  9. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

随机推荐

  1. JEECG 不同(角色的)人对同样的字段数据,使用不同的字段验证规则

    JEECG智能开发平台v3 开发指南http://www.jeecg.org/book/jeecg_v3.html jeecg: JEECG是一款基于代码生成器的J2EE快速开发平台,开源界“小普元” ...

  2. vue上传图片

    在用这块代码前需要在主页面index引入<script src="http://at.alicdn.com/t/font_kfbh2nlnqrrudi.js">< ...

  3. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系

    不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...

  4. Day1 基础知识

    数据类型,字符编码 二进制: 定义:二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是 ...

  5. leetcode:Roman to Integer and Integer to Roman

    2015-06-03 罗马数字以前接触过I到VIII比较多,直到遇见这个题目才知道更详细.阿拉伯数字和罗马数字之间的转换最重的是了解罗马数字的规则. 罗马数字规则:(总结) 1, 罗马数字共有7个,即 ...

  6. npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别

    npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...

  7. js 解决中文乱码的问题

    1.对象 request response 对象setCharacterEncoding=UTF-8 1 <%@ page language="java" contentTy ...

  8. css & clearfix & clear-fixed

    css & clearfix & clear-fixed https://zzk.cnblogs.com/my/s/blogpost-p?Keywords=clearfix .grou ...

  9. 五、compose 部署 GitLab 应用

    1.我们部署的是sameersbn/docker-gitlab这个镜像. docker pull sameersbn/gitlab 2.配置文件,我们不需要去run它,只需要先下载一个compose的 ...

  10. LODOP打印控件如何提示用户升级下载安装新版本

    Lodop.C-Lodop在不断完善功能和更新中,新版本修复了很多问题,以及增加很多有利的功能,网站如何更新版本,提示用户下载新版本呢?更新版本很简单,只需要三步:1.替换提示安装部分的自己放置的路径 ...