题目链接

首先这题是要求求出恰好有k个的方案数。

我们假设是f(k)f(k)f(k)。

设z(s)z(s)z(s)表示钦定集合sss里的位置一定是特殊的的方案数。

我们设g(k)=∑∣s∣=kz(s)g(k)=\sum_{{|s|=k}}z(s)g(k)=∑∣s∣=k​z(s)。

可以发现g(k)=∑k′≥kf(k′)∗(k′k)g(k)=\sum_{k\prime \geq k} f(k\prime)*\binom{k\prime}{k}g(k)=∑k′≥k​f(k′)∗(kk′​)。

根据二项式反演,可以推出。

f(k)=∑k′≥k(−1)k′−k∗g(k′)∗(k′k)f(k)=\sum_{k\prime\geq k} (-1)^{k\prime-k}*g(k\prime)*\binom{k\prime}{k}f(k)=∑k′≥k​(−1)k′−k∗g(k′)∗(kk′​)

其实这可以用容斥的思想来证明。

这样问题就转换成了怎么来求出z(s)z(s)z(s)。

我们可以用dpdpdp来求。
dpi,j,mask表示考虑前i个,已经使用了j个,i−1,i,i+1的是否使用的状态为maskdpi,j,mask→dpi+1,j′,new_maskdp_{i,j,mask}表示考虑前i个,已经使用了j个,i-1,i,i+1的是否使用的状态为mask\\ dp_{i,j,mask}\rightarrow dp_{i+1,j\prime,new\_mask} dpi,j,mask​表示考虑前i个,已经使用了j个,i−1,i,i+1的是否使用的状态为maskdpi,j,mask​→dpi+1,j′,new_mask​
这个转移也比较容易,最后∑∣s∣=kz(s)=∑dpn,k,∗\sum_{|s|=k} z(s)=\sum dp_{n,k,*}∑∣s∣=k​z(s)=∑dpn,k,∗​。

Code:

/*
{By GWj
*/
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define R(a) cin>>a
#define R2(a,b) cin>>a>>b
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
const int MOD=1e9+7;
int f[1001][1001][1<<3];
int n,k;
void add(int& x,int y){x+=y;if(x>=MOD)x-=MOD;
}
LL fact[1001],rfact[1001];
LL quick(int A,int B){if(!B) return 1ll;LL rest=quick(A,B>>1);rest*=rest;rest%=MOD;if(B&1) rest=rest*A%MOD;return rest;
}
int c(int A,int B){return fact[A]*rfact[B]%MOD*rfact[A-B]%MOD;
}
int main(){R2(n,k);f[0][0][0]=1;fact[0]=1;rb(i,1,1000)fact[i]=fact[i-1]*i%MOD;rfact[1000]=quick(fact[1000],MOD-2);rl(i,999,1){rfact[i]=rfact[i+1]*(i+1)%MOD;}rfact[0]=1;rep(i,n){rep(j,i+1){rep(mask,1<<3){if(f[i][j][mask]){int nex_mask=mask;nex_mask<<=1;nex_mask&=(1<<3)-1;if(i+2<=n){ add(f[i+1][j+1][nex_mask+1],f[i][j][mask]);}if(i>=1&&!(nex_mask&4)){ add(f[i+1][j+1][nex_mask+4],f[i][j][mask]);}add(f[i+1][j][nex_mask],f[i][j][mask]);  }}}} int rest=0;rb(kk,k,n){int res=0;rep(mask,1<<3){add(res,f[n][kk][mask]);}rb(i,1,n-kk){res=1ll*res*i%MOD;}if((kk-k)&1){res=1ll*res*c(kk,k)%MOD;res=MOD-res;rest+=res;rest%=MOD;}else{add(rest,1ll*res*c(kk,k)%MOD);}}cout<<rest<<endl;return 0;
}
/*
20 2
483564804*/

CF 285 E Positions in Permutations 题解相关推荐

  1. CodeForces 285 E.Positions in Permutations(dp+组合数学)

    Description 定义一个排列的权为满足|pi−i|=1|p_i-i|=1的ii的个数,问长度为nn的排列且权为kk的有多少个 Input 两个整数n,k(1≤n≤1000,0≤k≤n)n,k( ...

  2. Codeforces 285E Positions in Permutations dp + 容斥原理

    Positions in Permutations 先dp出选 k 个的方案数, 这个很简单, dp[ i ][ j ][ u ][ v ]表示到 i 为止选了 j 个, i - 1的选取情况是 u, ...

  3. CF 1093 E. Intersection of Permutations

    E. Intersection of Permutations 链接 题意: 给定两个序列,询问第一个排列的[l1,r1]和第二个排列[l2,r2]中有多少个共同的数,支持在第二个排列中交换两个数. ...

  4. 【cf】Codeforces 题解等汇总

    [cf]Codeforces Round #774 (Div. 2) 前4题 [cf]Codeforces Round #774 (Div. 2) 前4题_legend_yst的博客-CSDN博客 [ ...

  5. XCPC Team Trainning Round 1 (NCPC2018)

    补题地址 EOJ CF 榜单&补题情况 题解.分析和code一部分是自己写的,一部分是抄的队友的. A. Altruistic Amphibians 01背包 题意 给出n只青蛙和洞的高度d, ...

  6. Codeforces Daily (Round 370-410)

    前言:人菜就要多刷题 本题解更多是记录CF练习日常,顺便写写题解 由于技术原因,Dvi.1的题和个别EF会慢慢补 有的题目之前写过,这些题的题解会有些简陋 有的思路难以描述,这些题的题解会有些简陋 ≤ ...

  7. 排列组合 C(n,m)

    一.求解C(n, m) 公式一: 公式二: 公式二可以这么理解,从n个物品中取m个有2种情况:(1)不取第n个物品,于是从前n-1个中取m个; (2)取第n个物品,于是从前n-1个中取m-1; 所以答 ...

  8. 3月第一周总结(3.1~3.7)

    本周做了些什么呢? 按照考研复习计划,3月份只复习数学,英语和专业课. 数学: 完成了具体数学第二章的摘抄和课后题,第三章开了个头(第三章最后一节的难度看上去比较大TAT,不过也许和别人讨论一下会好一 ...

  9. 【日程训练】算法脱贫计划

    算法脱贫计划 前言 2020-12-26 2020-12-27 2020-12-28 ~ 2020-1-1 2021-1-1 ~ 2021-1-16 [寒假训练计划]2021-1-17 ~ 2021- ...

最新文章

  1. mysql为什么需要中间件_究竟为什么要引入数据库中间件
  2. 在 Vue 中正确使用 防抖 和 节流
  3. python处理windows弹窗_Python窗口IDE的基本处理,pythonwindowide
  4. linux mysql更改生效_linux下面MySQL变量修改及生效
  5. (文中有惊喜)走进云时代的数据库
  6. SAP License:如何更好的管理ERP中的供应商?
  7. 蚂蚁金服二面,竟然被问到事务的基本原理?
  8. mysql创建用户删除权限_mysql 用户创建、授权及删除、取消权限操作
  9. 技术规范,过几天发个压缩包,一次下载全部拥有
  10. 判断推理---逻辑判断
  11. 020:闭区间上连续函数性质之零点定理、介值定理
  12. python大数据工程师招聘_大数据工程师是做什么的为什么招聘网上薪资都好高啊?...
  13. 那些让我印象深刻的bug--04
  14. Parallels Desktop克隆出来的虚拟机拥有相同的SSH KEY的修改方法
  15. imx6ul-正点原子-imx6ul学习笔记(5)
  16. Elasticsearch教程 | 第三篇:审计设置
  17. Unity生成和使用obb
  18. Quectel_EC200xEC600xEG912Y系列_HTTP(S)_POST请求
  19. 近距离端详Android ART运行时库
  20. 任正非:到底什么样的人才能当干部

热门文章

  1. sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
  2. 计算机专业专科可以进的国企,专科毕业生想进国企?这三大专业不要错过,成功率高达60%...
  3. 使用Python对文件进行批量改名
  4. 生鲜配送app开发方案
  5. 测试IP和端口是否被封锁
  6. 8代cpu核数及线程
  7. 痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 一表搜罗指令集
  8. 9月26日-计算机导论-课程内容(3)
  9. [笔试] 搜狗校招哈尔滨,武汉站 - 实现加减乘操作
  10. SpringCloud Gateway API接口安全设计(加密 、签名)