2018.11.07 hdu1465不容易系列之一(二項式反演)
阿新 • • 發佈:2018-12-20
傳送門 其實標籤只是搞笑的。 沒那麼難。 二項式反演只是殺雞用牛刀而已。 這道題也只是讓你的錯排數而已。 還記得那個的遞推式嗎? 沒錯那個方法比我今天用的要快一些。
言歸正傳。 回憶一下二項式反演的式子: => 證明很簡單。 只用把第一個式子成立的條件帶到第二個等式的右邊就可以了。 然後這道題怎麼用呢? 我們令表示張牌任意排列的總方案數。 表示張牌全部錯排的方案數。 那麼根據分類計數的原理顯然有: 於是 做完了。 程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=21;
ll fac[N];
int n;
int main(){
fac[0]=1;
for(int i=1;i<=20;++i)fac[i]=fac[i-1]*i;
while(~scanf("%d",&n)){
ll ans=0,tmp=1;
for(int i=0;i<=n;++i,tmp*=-1)ans+=tmp*fac[n]/fac[i];
cout<<ans<<'\n';
}
return 0;
}