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);
    }
}

猜你喜欢

转载自www.cnblogs.com/dreagonm/p/10428147.html