HDU 1465 不容易系列之一
扯淡
貌似有傻逼的做法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);
}
}