思路

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)!

然后二项式反演就行了

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define int long long
  5. using namespace std;
  6. const int MOD = 1000000007;
  7. int dp[1100][1100][2][2],jc[1100],inv[1100],n,m,f[1100];
  8. int pow(int a,int b){
  9. int ans=1;
  10. while(b){
  11. if(b&1)
  12. ans=(ans*a)%MOD;
  13. a=(a*a)%MOD;
  14. b>>=1;
  15. }
  16. return ans;
  17. }
  18. int C(int n,int m){
  19. return jc[n]*inv[m]%MOD*inv[n-m]%MOD;
  20. }
  21. signed main(){
  22. scanf("%lld %lld",&n,&m);
  23. dp[0][0][1][0]=1;
  24. for(int i=1;i<=n;i++)
  25. for(int j=0;j<i;j++)
  26. for(int k=0;k<2;k++)
  27. for(int p=0;p<2;p++){
  28. dp[i][j][p][0]=(dp[i][j][p][0]+dp[i-1][j][k][p])%MOD;
  29. if(k==0)
  30. dp[i][j+1][p][0]=(dp[i][j+1][p][0]+dp[i-1][j][k][p])%MOD;
  31. if(i<n)
  32. dp[i][j+1][p][1]=(dp[i][j+1][p][1]+dp[i-1][j][k][p])%MOD;
  33. }
  34. // for(int i=1;i<=n;i++)
  35. // for(int j=0;j<i;j++)
  36. // for(int k=0;k<2;k++)
  37. // for(int p=0;p<2;p++)
  38. // printf("dp[%lld][%lld][%lld][%lld]=%lld\n",i,j,k,p,dp[i][j][k][p]);
  39. jc[0]=1;
  40. for(int i=1;i<=n;i++)
  41. jc[i]=(jc[i-1]*i)%MOD;
  42. inv[n]=pow(jc[n],MOD-2);
  43. for(int i=n-1;i>=0;i--)
  44. inv[i]=(inv[i+1]*(i+1))%MOD;
  45. for(int i=0;i<=n;i++){
  46. int mid1=0;
  47. for(int j=0;j<2;j++)
  48. for(int k=0;k<2;k++)
  49. mid1=(mid1+dp[n][i][j][k])%MOD;
  50. f[i]=mid1%MOD*jc[n-i]%MOD;
  51. }
  52. // for(int i=0;i<=n;i++)
  53. // printf("f[%lld]=%lld\n",i,f[i]);
  54. int ans=0;
  55. for(int i=m;i<=n;i++)
  56. ans=(ans+((((i-m)&1)?-1:1)*C(i,m)%MOD*f[i]%MOD+MOD)%MOD)%MOD;
  57. printf("%lld\n",ans);
  58. return 0;
  59. }

CF285E Positions in Permutations的更多相关文章

  1. CF285E Positions in Permutations(dp+容斥)

    题意,给定n,k,求有多少排列是的 | p[i]-i |=1 的数量为k. Solution 直接dp会有很大的后效性. 所以我们考虑固定k个数字使得它们是合法的,所以我们设dp[i][j][0/1] ...

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

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

  3. 【CF285E】Positions in Permutations(动态规划,容斥)

    [CF285E]Positions in Permutations(动态规划,容斥) 题面 CF 洛谷 题解 首先发现恰好很不好算,所以转成至少,这样子只需要确定完一部分数之后剩下随意补. 然后套一个 ...

  4. Codeforces 285 E. Positions in Permutations

    \(>Codeforces \space 285 E. Positions in Permutations<\) 题目大意 : 定义一个长度为 \(n\) 的排列中第 \(i\) 个元素是 ...

  5. 【CF285E】Positions in Permutations

    题目 刷水题涨信心 显然这是个广义容斥,我们现在算一下至少有\(i\)个完美数的方案数就好了 这\(1000\)的数据范围显然在暗示\(n^2\)的dp 我们注意到这个条件大概就是\(P_i=i-1\ ...

  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. CF285 E Positions in Permutations——“恰好->大于”的容斥和允许“随意放”的dp

    题目:http://codeforces.com/contest/285/problem/E 是2018.7.31的一场考试的题,当时没做出来. 题解:http://www.cnblogs.com/y ...

  8. Codeforces 285E - Positions in Permutations(二项式反演+dp)

    Codeforces 题目传送门 & 洛谷题目传送门 upd on 2021.10.20:修了个 typo( 这是一道 *2600 的 D2E,然鹅为啥我没想到呢?wtcl/dk 首先第一步我 ...

  9. Codeforces Round #175 (Div. 2)

    A. Slightly Decreasing Permutations 后\(k\)个倒序放前面,前\(n-k\)个顺序放后面. B. Find Marble 模拟. C. Building Perm ...

随机推荐

  1. Dagger2 导入项目

    导入分为两步: 第一步: 在Project build.gradle 文件中加入: dependencies { // Dagger2 第一步classpath 'com.neenbedankt.gr ...

  2. thinkphp5中使用PHPExcel(转载)

    thinkphp5中可以使用composer来获取第三方类库,使用起来特别方便,例如:可是使用composer下载PHPMailer,think-captcha(验证码)等等…… 接下来说一下怎么使用 ...

  3. ArcGIS AddIN开发之 设置当前工具为Edit Tool

    在GIS数据处理中,经常需要选择要素,再进行操作.所以,为了处理的方便,可以将当前工具处理结束后,将当前工具设置为Edit Tool,以方便下一次的选择处理. 相关资料: 1.ArcMap Name ...

  4. LCA || BZOJ 1602: [Usaco2008 Oct]牧场行走 || Luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题面:[USACO08OCT]牧场散步Pasture Walking 题解:LCA模版题 代码: #include<cstdio> #include<cstring> #inc ...

  5. 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园

    题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...

  6. php利用OpenXML规范生成word,excel(pdf其他方法)

    这个涉及到的东西比较多 HTTP MIME types $contract_data = '<html xmlns:o="urn:schemas-microsoft-com:offic ...

  7. centos7磁盘在线扩容

    1.添加新磁盘 2.fdisk -l查看磁盘被识别的名称 3.如果输入fdisk -l命令没有找到新的磁盘,按下面步骤操作 1)进入到cd /sys/class/scsi_host/ 2)echo & ...

  8. 数组/Array/Tuple/yield

    数组 如果需要使用同一类型的多个对象,就可以考虑使用集合和数组.如果需要使用不同类型的多个对象,可以考虑使用Tuple(元组) 数组的声明 在声明数组时,应先定义数组元素中的类型,其后是一对空方括号和 ...

  9. 洛谷P2569 股票交易 [SCOI2010] dp

    正解:dp+单调队列优化 解题报告: 先放个传送门鸭qwq umm首先dp转移挺好想的?就买和不买 f[i][j]表示第i天手上有j的股份的最多钱,转移也很好想?就枚举第1天到第i-w-1天枚举买k股 ...

  10. favorite learning link

    Xpath https://www.cnblogs.com/chenshaoping/p/5540434.html Awk Sort https://www.cnblogs.com/chengmo/a ...