[hdu 2068 RPG的错排] 错排公式
题目链接:
[hdu 2068 RPG的错排]
题意:略。
分析:错排公式 F[i] = (i - 1) * (F[i - 1] + F[i - 2]); 然后累加就好了。
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define fst first
#define snd second
typedef __int64 LL;
//typedef long long LL;
typedef unsigned int uint;
typedef pair<int, int> PII;
const int MAXN = 30;
int T, N;
LL F[MAXN];
LL C[MAXN][MAXN];
LL res;
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif // ONLINE_JUDGE
F[0] = 1LL, F[1] = 0LL;
for (int i = 2; i < MAXN; i++) {
F[i] = (LL) (i - 1) * (F[i - 1] + F[i - 2]);
}
for (int i = 1; i < MAXN; i++) {
C[i][0] = C[i][i] = 1LL;
for (int j = 1; j < i; j++) {
C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
}
}
// for (N = 1; N <= 25; N ++) {
while (~scanf ("%d", &N) && N) {
res = 0LL;
for (int i = (N + 1) >> 1, j; i <= N; i++) {
j = N - i;
res += (C[N][i]) * F[j];
}
printf ("%I64d\n", res);
}
return 0;
}