CF285E Positions in Permutations
思路
dp+二项式反演的神题
就是dp部分非常麻烦(好吧是我傻了
考虑先钦定m个满足条件的位置,这m个\(x_i\),只能放\(x_i-1\)或\(x_i+1\),然后其他的随便放(得出至少m个的方案数,然后上一发二项式反演即可
设dp[i][j][0/1][0/1]表示前i个,有j个满足条件的位置,第i个和第i+1个是否被放在其他位置,
然后有,
dp[i][j][k][0]+=dp[i-1][j][p][k](不管第i个位置,第i个位置没有被选中)
dp[i][j+1][k][0]+=dp[i-1][j][p][k](p==0,第i-1没有被放在其他位置,第i-1个放在第i个产生贡献)
dp[i][j+1][k][1]+=dp[i-1][j][p][k](i<n,第i+1个被放在第i个产生贡献)
然后f[i]就是dp[i][m][0][0]+dp[i][m][1][0]+dp[i][m][0][1]+dp[i][m][1][1]
因为其他随便放,所以f[i]再乘上一个(n-i)!
然后二项式反演就行了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MOD = 1000000007;
int dp[1100][1100][2][2],jc[1100],inv[1100],n,m,f[1100];
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(ans*a)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return ans;
}
int C(int n,int m){
return jc[n]*inv[m]%MOD*inv[n-m]%MOD;
}
signed main(){
scanf("%lld %lld",&n,&m);
dp[0][0][1][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int k=0;k<2;k++)
for(int p=0;p<2;p++){
dp[i][j][p][0]=(dp[i][j][p][0]+dp[i-1][j][k][p])%MOD;
if(k==0)
dp[i][j+1][p][0]=(dp[i][j+1][p][0]+dp[i-1][j][k][p])%MOD;
if(i<n)
dp[i][j+1][p][1]=(dp[i][j+1][p][1]+dp[i-1][j][k][p])%MOD;
}
// for(int i=1;i<=n;i++)
// for(int j=0;j<i;j++)
// for(int k=0;k<2;k++)
// for(int p=0;p<2;p++)
// printf("dp[%lld][%lld][%lld][%lld]=%lld\n",i,j,k,p,dp[i][j][k][p]);
jc[0]=1;
for(int i=1;i<=n;i++)
jc[i]=(jc[i-1]*i)%MOD;
inv[n]=pow(jc[n],MOD-2);
for(int i=n-1;i>=0;i--)
inv[i]=(inv[i+1]*(i+1))%MOD;
for(int i=0;i<=n;i++){
int mid1=0;
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
mid1=(mid1+dp[n][i][j][k])%MOD;
f[i]=mid1%MOD*jc[n-i]%MOD;
}
// for(int i=0;i<=n;i++)
// printf("f[%lld]=%lld\n",i,f[i]);
int ans=0;
for(int i=m;i<=n;i++)
ans=(ans+((((i-m)&1)?-1:1)*C(i,m)%MOD*f[i]%MOD+MOD)%MOD)%MOD;
printf("%lld\n",ans);
return 0;
}
CF285E Positions in Permutations的更多相关文章
- CF285E Positions in Permutations(dp+容斥)
题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...
- 【做题】CF285E. Positions in Permutations——dp+容斥
题意:求所有长度为\(n\)的排列\(p\)中,有多少个满足:对于所有\(i \,(1 \leq i \leq n)\),其中恰好有\(k\)个满足\(|p_i - i| = 1\).答案对\(10^ ...
- 【CF285E】Positions in Permutations(动态规划,容斥)
[CF285E]Positions in Permutations(动态规划,容斥) 题面 CF 洛谷 题解 首先发现恰好很不好算,所以转成至少,这样子只需要确定完一部分数之后剩下随意补. 然后套一个 ...
- Codeforces 285 E. Positions in Permutations
\(>Codeforces \space 285 E. Positions in Permutations<\) 题目大意 : 定义一个长度为 \(n\) 的排列中第 \(i\) 个元素是 ...
- 【CF285E】Positions in Permutations
题目 刷水题涨信心 显然这是个广义容斥,我们现在算一下至少有\(i\)个完美数的方案数就好了 这\(1000\)的数据范围显然在暗示\(n^2\)的dp 我们注意到这个条件大概就是\(P_i=i-1\ ...
- CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)
Permutation p is an ordered set of integers p1, p2, ..., pn, consisting of n distinct positive in ...
- CF285 E Positions in Permutations——“恰好->大于”的容斥和允许“随意放”的dp
题目:http://codeforces.com/contest/285/problem/E 是2018.7.31的一场考试的题,当时没做出来. 题解:http://www.cnblogs.com/y ...
- Codeforces 285E - Positions in Permutations(二项式反演+dp)
Codeforces 题目传送门 & 洛谷题目传送门 upd on 2021.10.20:修了个 typo( 这是一道 *2600 的 D2E,然鹅为啥我没想到呢?wtcl/dk 首先第一步我 ...
- Codeforces Round #175 (Div. 2)
A. Slightly Decreasing Permutations 后\(k\)个倒序放前面,前\(n-k\)个顺序放后面. B. Find Marble 模拟. C. Building Perm ...
随机推荐
- 23.react-router 路由
箭头函数扩展: 箭头函数: functoin 函数名(参数){ 函数体 } 箭头函数: 1.把function删掉 , 2.参数和{}之间加上 箭头=> 简写: 1.参数的简写:只有一个参 ...
- AARRR 量化感染率
小结: 1. 用户生命周期 2. K因子量化了感染的概率,即一个已经感染了病毒的宿主所能接触到的所有宿主中,会有多少宿主被其传染上病毒. 假设平均每个用户会向20个朋友发出邀请,而平均的转化率为10% ...
- PrimeNG之Validation
Validation ----primeng输入组件显示验证错误时自动标记为无效值. demo code export class ValidationDemo implements OnInit { ...
- Spring Boot 2.0 新特性和发展方向
以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...
- 15.4-uC/OS-III资源管理(二值信号量)
互斥信号量是 uC/OS 操作系统的一个内核对象, 与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量, 主要用于保护资源. 1.如果想要使用互斥信号量,就必须事先使能互斥信号 ...
- 保存退出vi编辑
保存命令按i进入编辑模式,编辑完成按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi:w file 将修改另外保存到file中,不退出vi:w! 强制保存,不推出vi:wq 保存文件并退出v ...
- freeswitch报错
1. 2010-10-26 11:01:58.448513 [ERR] sofia_reg.c:816 Can not do authorization without a compl ...
- 只需十四步:从零开始掌握 Python 机器学习(附资源)
分享一篇来自机器之心的文章.关于机器学习的起步,讲的还是很清楚的.原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找 ...
- laravel框架基础(1)---入门与介绍
1.安装laravel5.7 (composer )2018-12-28 11:59:02 [作者:struggler] Php的版本要求:php>=7.1.3 打开php OpenSSL扩展 ...
- noip2016海港
题目描述 Description 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只 ...