扯淡
貌似有傻逼的做法XD
话说我没开long long,忘读入n,忘了清零ans WA了三遍是什么操作啊
傻了傻了
思路
显然是一个错排问题啊XD
但是我们不套公式,我们用一发二项式反演
二项式反演的一个基本形式是
[F_n=Sigma_{i=0}^n C_n^i G_i Rightarrow G_n=Sigma_{i=0}^n(-1)^{n-i}C_n^i F_i
]
套入这道题中,我们可以首先确定k个位置的值是正确的,则有
[n!=Sigma_{i=0}^nC_n^iF_i
]
推出
[F_i=Sigma_{i=0}^n(-1)^{n-i}C_n^i i!
]
根据组合数的公式,推出
[ans=n!Sigma_{i=0}^n(-1)^{n-i}frac{1}{(n-i)!}
]
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
long long jc[30],n;
long long ans=0;
int main(){
jc[0]=1;
for(int i=1;i<=20;i++)
jc[i]=jc[i-1]*i;
while(scanf("%lld",&n)==1){
ans=0;
for(int i=0;i<=n;i++)
ans+=((i%2)?-1:1)*jc[n]/jc[i];
printf("%lld
",ans);
}
}