Iahub and Permutations

题解:

令 cnt1 为可以没有限制位的填充数字个数。

令 cnt2 为有限制位的填充数字个数。

那么:对于cnt1来说, 他的值是cnt1!

然后我们对cnt2进行dp。

对于任意一个新加进来的数字,我们可以令一个一个没有限制位数放在这里, 那么新加进来的数字 ≈ 没有限制位, 他的方案为 i-1 * dp[i-1]

, 然后我们如果把这个数字放到有限制位的数来说, 那么他的转移方程就和错排一样了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod = (int)1e9+;
const int N = 1e5 + ;
LL dp[N];
int fvis[N];
int vis[N];
int cnt1, cnt2;
int main(){
int n, t;
scanf("%d", &n);
for(int i = ; i <= n; ++i){
scanf("%d", &t);
if(t == -) continue;
vis[t] = ;
fvis[i] = ;
}
for(int i = ; i <= n; ++i){
if(vis[i] + fvis[i] == ) ;
else if(!vis[i] && fvis[i]) cnt1++;
else if(vis[i] + fvis[i] == ) cnt2++;
}
dp[] = ;
// cout << cnt1 << " " << cnt2 << endl;
for(int i = ; i <= cnt1; ++i) dp[] = dp[] * i % mod;
for(int i = ; i <= cnt2; ++i){
dp[i] = cnt1 * dp[i-] % mod + (i-) * dp[i-] % mod;
if(i >= ) dp[i] += (i-) * dp[i-] % mod;
dp[i] %= mod;
// cout << dp[i] << endl;
}
cout << dp[cnt2] << endl;
return ;
}

最新文章

  1. javascript常量
  2. ASP.NET中利用DataList实现图片无缝滚动
  3. H264中的SPS、PPS提取与作用
  4. iOS中 常用的mac终端指令
  5. HDU 4932 Miaomiao&amp;#39;s Geometry(推理)
  6. Tkinter 导入安装包
  7. MyEclipse下安装FatJar打包工具
  8. vim置于后台,vim 编辑多文件
  9. Android开发学习之路--UI之初体验
  10. flask + MySQL-python 创建 webapp 应用
  11. P2146 [NOI2015]软件包管理器
  12. Elasticsearch 基于 URL 的搜索请求
  13. 从yield 到yield from再到python协程
  14. python list的函数
  15. todo: 改变字体的动画
  16. TableView中Label自适应高度
  17. Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满屏幕
  18. 孤岛营救问题(BFS+状压DP)
  19. Oracle入门第六天(上)——用户控制
  20. 【Linux学习】1.Linux基础知识

热门文章

  1. WIN10安装VC6.0无法使用的解决办法
  2. Java虚拟机详解(四)------垃圾收集器
  3. npm 一些有用的提示和技巧
  4. 【Java例题】7.3 线程题3-素数线程
  5. 【Java例题】2.8 解一元二次方程
  6. 并发知识(2)——关于Thread
  7. Re-Architecting the Video Gatekeeper(一)
  8. html学习笔记整理
  9. 通俗易懂--循环神经网络(RNN)的网络结构!(TensorFlow实现)
  10. .net软件开发脚本规范-JS标准