扯淡
貌似有傻逼的做法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\n",ans);
}
}