标签:
Description
Input
Output
Sample Input
Sample Output
假设i个人在他本来位置,其余人错排的种数是f[i],那么题目要求的就是所有大于等于(n+1)/2的f[i]的和,n+1是为了对奇数偶数情况统一。
假设k个人错排是p[k],
那么就是n个人先取出i个人在自己位置C(n, i),其余人再错排p[n-i],然后控制i的范围就OK了。
这里需要注意的是由于题目没有模的情况,所以所有数可能会很大,所以在求p和c的时候最好是相邻项间递推。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <set> #include <map> #include <queue> #include <string> #include <algorithm> #define LL long long using namespace std; int n; LL p[30], c[30], ans; void init() { p[0] = 1; p[1] = 0; p[2] = 1; for (int i = 3; i < 30; ++i) p[i] = (i-1)*(p[i-1]+p[i-2]); } void cal() { c[0] = 1; for (int i = 1; i <= n; ++i) c[i] = c[i-1]*(n-i+1)/i; } void work() { ans = 0; int half = (n+1)/2; for (int i = 0; i+half <= n; ++i) ans += c[i+half]*p[n-i-half]; printf("%I64d\n", ans); } int main() { //freopen("test.in", "r", stdin); init(); while (scanf("%d", &n) != EOF && n) { cal(); work(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/andyqsmart/p/4756598.html