CodeForces 340E Iahub and Permutations 错排dp
2024-09-01 05:53:03
题解:
令 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 ;
}
最新文章
- javascript常量
- ASP.NET中利用DataList实现图片无缝滚动
- H264中的SPS、PPS提取与作用
- iOS中 常用的mac终端指令
- HDU 4932 Miaomiao&;#39;s Geometry(推理)
- Tkinter 导入安装包
- MyEclipse下安装FatJar打包工具
- vim置于后台,vim 编辑多文件
- Android开发学习之路--UI之初体验
- flask + MySQL-python 创建 webapp 应用
- P2146 [NOI2015]软件包管理器
- Elasticsearch 基于 URL 的搜索请求
- 从yield 到yield from再到python协程
- python list的函数
- todo: 改变字体的动画
- TableView中Label自适应高度
- Android RelativeLayout wrap_content 而且 child view 使用 layout_alignParentBottom 时 RelativeLayout 高度会占满屏幕
- 孤岛营救问题(BFS+状压DP)
- Oracle入门第六天(上)——用户控制
- 【Linux学习】1.Linux基础知识