二项式反演公式
那个括号起来的就是组合数,我记得组合数那章我有说过
所以来一道例题:
设g(i)表示正好有i封信装错信封
那么全部的C(n, i)*g(i)加起来正好就是所有装信的情况,总共n!种情况
n! = Σ C(n, i)*g(i) (i从0到n)
那么f(n) = n!,所以f(x) = x!
那么我们要求g(n)
根据公式
g(n) = Σ (-1)^(n-i) * C(n, i) * f(i) (i从0到n)
#include<cstdio>
typedef long long LL;
int n, flag;
LL fac[25];
LL ans;
void init(){
fac[0] = 1;
for(int i = 1; i <= 20; i ++) fac[i] = fac[i-1] * i;
}
int main(){
init();
while(~scanf("%d", &n)){
ans = 0;
flag = n & 1 ? -1 : 1;//起始符号
for(int i = 0; i <= n; i ++){
ans += flag * fac[n] / fac[n-i];
flag = -flag;
}
printf("%I64d\n", ans);
}
}