您的位置:首页 > 其它

Arrange the Numbers-LightOJ - 1095

2018-03-05 21:44 351 查看
题意:给定n个自然数,在重新排列之后,要求前m个数有k个数在原来位置上,问一共有多少种排列
题解:错排
AC代码:
#include<cstring>
#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
const ll mod = 1000000;
int a, m, k;
ll c[1010][1010], d[1010];

void init() {
memset(c, 0, sizeof(c));
memset(d, 0, sizeof(d));
int i, j;
c[0][0] = 1;
c[1][0] = c[1][1] = 1;
for (i = 2; i < 1010; i++) {
c[i][0] = c[i][i] = 1;
for (j = 1; j < i; j++) {
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
}
}
d[0] = 1;
d[1] = 0;
d[2] = 1;
for (i = 3; i < 1010; i++) {
d[i] = (i - 1) * (d[i - 1] + d[i - 2]) % mod;
}
}

ll comb() {
ll ans = 0;
int i;
for (i = 0; i <= a - m; i++) {
ans += c[a - m][i] * d[a - k - i] % mod;
ans %= mod;
}
return c[m][k] * ans % mod;
}

int main() {
int cas, c;
init();
cin >> cas;
for (c = 1; c <= cas; c++) {
cin >> a >> m >> k;
printf("Case %d: %lld\n", c, comb());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 数论