题意,给定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. 认识Debian

    Debian -- 通用操作系统https://www.debian.org/ DebianStretch - Debian Wikihttps://wiki.debian.org/DebianStr ...

  2. 正则校验:微信号,qq号,邮箱

    java判断微信号.手机.名字的正则表达 - willgos - 博客园https://www.cnblogs.com/solossl/p/5813106.html 微信号正则校验,qq正则,邮箱正则 ...

  3. HTTL之初印象

    概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...

  4. Azure系列2.1.2 —— BlobContainerProperties

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  5. [转帖] SS, SP, BP 三个寄存器

    SS, SP, BP 三个寄存器 https://blog.csdn.net/vspiders/article/details/55669265 这么看 计算机组成原理 还有 考试的很多题目非常有用啊 ...

  6. Day 6-2简单的socket通信

    什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

  7. Gitlab中README.MD编写格式模板

    README.MD文件 格式: 源码: # Hbase组件 ## Maven依赖 ``` <dependency> <groupId>catf</groupId> ...

  8. 线程同步Volatile与Synchronized(一)

    volatile 一.volatile修饰的变量具有内存可见性 volatile是变量修饰符,其修饰的变量具有内存可见性. 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改 ...

  9. 基于create-react-app的再配置

    前面的话 使用Facebook官方推出的create-react-app脚手架,我们基本可以零配置搭建基于webpack的React开发环境.但是,如果需要个性化定制,则还需要基于create-rea ...

  10. JSON 解析 (一)—— FastJSON的使用

    FastJSON是一个高性能.功能完善的json序列化和解析工具库,可使用Maven添加依赖 <dependency> <groupId>com.alibaba</gro ...