Description

定义一个排列的权为满足|pi−i|=1|p_i-i|=1的ii的个数,问长度为nn的排列且权为kk的有多少个

Input

两个整数n,k(1≤n≤1000,0≤k≤n)n,k(1\le n\le 1000,0\le k\le n)

Output

输出满足条件的排列数,结果模109+710^9+7

Sample Input

3 2

Sample Output

4

Solution

第ii个位置想合法必然要放i−1i-1或i+1i+1, 但i−1i-1可能会被第i−2i-2个位置用了,所以用dp[i]][j][x][y]dp[i]][j][x][y]表示前ii个位置权为jj且第ii个位置被使用x=1x=1(没被使用(x=0)(x=0)),第i+1i+1个位置被使用y=1y=1(没被使用(y=0)(y=0)),考虑当前位放i−1i-1或i+1i+1或其他数字有转移方程

dp[i][j+1][y][0]+=dp[i−1][j][0][y]dp[i][j+1][y][0]+=dp[i-1][j][0][y]

dp[i][j+1][y][1]+=dp[i−1][j][x][y],i<ndp[i][j+1][y][1]+=dp[i-1][j][x][y],i

dp[i][j][y][0]=dp[i−1][j][x][y]dp[i][j][y][0]=dp[i-1][j][x][y]

令f[i]=(n−i)!⋅∑x=01∑y=01dp[n][i][x][y]f[i]=(n-i)!\cdot \sum\limits_{x=0}^1\sum\limits_{y=0}^1dp[n][i][x][y],则f[i]f[i]为权至少为ii的排列个数,那么对于i<ji,权至少为jj的排列在权至少为ii的排列中出现了CijC_j^i次,所以有f[i]−=Cij⋅f[j]f[i]-=C_j^i\cdot f[j],最终f[k]f[k]即为答案

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=1005;
#define mod 1000000007
int C[maxn][maxn],fact[maxn];
void add(int &x,int y)
{x=x+y>=mod?x+y-mod:x+y;
}
void sub(int &x,int y)
{x=x-y<0?x-y+mod:x-y;
}
void init(int n=1000)
{C[0][0]=1;for(int i=1;i<=n;i++){C[i][0]=C[i][i]=1;for(int j=1;j<i;j++)add(C[i][j],C[i-1][j-1]+C[i-1][j]);}fact[0]=1;for(int i=1;i<=n;i++)fact[i]=(ll)i*fact[i-1]%mod;
}
int n,k,dp[maxn][maxn][2][2],f[maxn];
int main()
{init();scanf("%d%d",&n,&k);dp[0][0][1][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<i;j++)for(int x=0;x<=1;x++)for(int y=0;y<=1;y++){if(!x)add(dp[i][j+1][y][0],dp[i-1][j][x][y]);if(i<n)add(dp[i][j+1][y][1],dp[i-1][j][x][y]);add(dp[i][j][y][0],dp[i-1][j][x][y]); }for(int i=0;i<=n;i++)for(int x=0;x<=1;x++)for(int y=0;y<=1;y++)add(f[i],dp[n][i][x][y]);for(int i=0;i<=n;i++)f[i]=(ll)f[i]*fact[n-i]%mod;for(int i=n-1;i>=k;i--)for(int j=i+1;j<=n;j++)sub(f[i],(ll)f[j]*C[j][i]%mod);printf("%d\n",f[k]);return 0;
}

CodeForces 285 E.Positions in Permutations(dp+组合数学)相关推荐

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

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

  2. CF 285 E Positions in Permutations 题解

    题目链接 首先这题是要求求出恰好有k个的方案数. 我们假设是f(k)f(k)f(k). 设z(s)z(s)z(s)表示钦定集合sss里的位置一定是特殊的的方案数. 我们设g(k)=∑∣s∣=kz(s) ...

  3. Codeforces 148D. Bag of mice(概率dp)

    Codeforces 148D. Bag of mice(概率dp) Description The dragon and the princess are arguing about what to ...

  4. CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)

    题目链接:点击查看 题目大意:给出一个 01 字符串,规定求值的过程如下: 每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数 ...

  5. Codeforces 1276D/1259G Tree Elimination (树形DP)

    题目链接 http://codeforces.com/contest/1276/problem/D 题解 我什么DP都不会做,吃枣药丸-- 设\(f_{u,j}\)表示\(u\)子树内,\(j=0\) ...

  6. Codeforces 264B Good Sequences ★ (分解素因子+DP)

    题目链接:http://codeforces.com/problemset/problem/264/B 题目大意:给定一个数列a1,a2,a3,a4,--,an(数据保证ai严格递增,n<=10 ...

  7. Codeforces 118 D. Caesar's Legions (dp)

    题目链接:http://codeforces.com/contest/118/problem/D 有n个步兵和m个骑兵要排成一排,其中连续的步兵不能超过k1个,连续的骑兵不能超过k2个. dp[i][ ...

  8. CodeForces - 468C Hack it!(构造+数位dp)

    题目链接:点击查看 题目大意:求出一段区间 [l,r][l,r][l,r] 的数位和对 aaa 取模后为 000.更具体的,设 f(x)f(x)f(x) 为 xxx 的数位和,本题需要求出一对 [l, ...

  9. CodeForces - 1550E Stringforces(二分+状压dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...

最新文章

  1. Android QQ、微信聊天消息界面设计原理与实现
  2. 精通python能干什么-转行做数据分析,是否需要精通python?
  3. 普通视图和物化视图区别
  4. php mysql crud demo_基于php和mysql的简单的dao类实现crud操作功能_PHP教程
  5. 21-特征匹配方法(Brute-Force蛮力匹配)
  6. string容量JAVA_java的StringBuilder类的长度和容量有什么区别呢?
  7. opensplice dds v6.3.2_DDS生态社区带你解读|Filecoin创始人胡安:数据存储需求未来会增长3倍...
  8. SQL Server 触发器 详细讲解
  9. tomcat安装-tomcat8.5
  10. vi 和 vim 的区别
  11. 机器学习(周志华) 第八章集成学习
  12. 接口测试 requests的身份认证方式
  13. linux中yum -y install mysql为什么默认是mariadb?以及mysql yum源的配置
  14. 【转】ORA-28040: 没有匹配的验证协议
  15. EVE-ng模拟器安装教程和使用教程
  16. 5元的小乌龟吃什么_小乌龟吃什么?小乌龟怎么养经验详解
  17. 对8086的存储器扩展
  18. 转载:摄影相关照片(相纸)尺寸大…
  19. 如何求矩阵的若儿当标准型
  20. C#.NET使用TTS引擎实现文语转换

热门文章

  1. 如何自己开发一个Android APP(3)——XML和Android
  2. Linkflow+微信公众号:如何提升首购率
  3. Java 数组和List的使用
  4. bzoj 2959: 长跑(LCT+并查集)
  5. 量子计算机不能解决的问题,量子计算机破产问题传统计算机无法解决
  6. Android Gatekeeper
  7. kali中exiftool命令查看图片exif信息
  8. oracle备份数据库的格式,ORACLE 数据库备份文件的后缀是()。
  9. 想不想修真鸿蒙源液有什么用,想不想修真初代小世界怎么玩_想不想修真初代小世界玩法介绍_玩游戏网...
  10. 4g手机关闭4g信号显示无服务器,手机4G信号栏为什么突然出现“HD”?原来开通了这个业务,望周知...