P1595 信封问题
关于本题二项式反演的做法
直接问恰好没有信封放对不太好做,那么可以转换一下。
设
可以推导得:
接下来套二反,设
由二项式反演公式得:
将
将
那么就好做了,预处理阶乘,时间复杂度
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,ans;
int fac[25];
int C(int n,int m)
{
if(n<m)return 0;
return fac[n]/fac[m]/fac[n-m];
}
signed main()
{
scanf("%lld",&n);
fac[0]=1;
for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i;
for(int i=0;i<=n;i++)
{
if(i&1)ans-=(C(n,i)*fac[n-i]);
else ans+=(C(n,i)*fac[n-i]);
}
cout<<ans;
}