不容易系列之一

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不容易系列之一相关的知识,希望对你有一定的参考价值。

不容易系列之一

题意:

n个数,求n个人错排(全部错误)的方案数

题解:

这题地推可以求,咱们这里用二项式反演来做
f ( i ) 为 恰 好 有 i 个 人 错 排 f(i)为恰好有i个人错排 f(i)i g ( i ) 为 最 多 i 个 人 错 排 g(i)为最多i个人错排 g(i)i,显然 g ( i ) = i ! g(i)=i! g(i)=i
g ( n ) = ∑ i = 0 n C n i ∗ f ( i ) g(n)=\\sum_{i=0}^nC_{n}^i*f(i) g(n)=i=0nCnif(i)
反演下有:
f ( n ) = ∑ i = 0 n ( − 1 ) n − i ∗ C n i ∗ g ( i ) = ∑ i = 0 n ( − 1 ) n − i ∗ C n i ∗ i ! f(n)=\\sum_{i=0}^n(-1)^{n-i}*C_{n}^i*g(i)=\\sum_{i=0}^n(-1)^{n-i}*C_{n}^i*i! f(n)=i=0n(1)niCnig(i)=i=0n(1)niCnii

代码:

#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{
    x= 0;
    char c= getchar();
    bool flag= 0;
    while (c < '0' || c > '9')
        flag|= (c == '-'), c= getchar();
    while (c >= '0' && c <= '9')
        x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();
    if (flag)
        x= -x;
    read(Ar...);
}
template <typename T> inline void write(T x)
{
    if (x < 0) {
        x= ~(x - 1);
        putchar('-');
    }
    if (x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#else
    startTime = clock ();
    freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#else
    endTime= clock();
    printf("\\nRun Time:%lfs\\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn=50;
ll fac[maxn];
void init(int n){
	fac[0]=1;
	fac[1]=1;
	for(int i=2;i<=n;i++){
		fac[i]=fac[i-1]*i;
	}
}
ll C(ll n,ll m){
	ll ans=1;
	for(int i=m+1;i<=n;i++)ans=ans*i;
	for(int i=1;i<=n-m;i++)ans/=i;
	return ans;
}
int main()
{
    //rd_test();
	init(45);
	ll n;
	while(scanf("%lld",&n)!=EOF){
		ll ans=0;
		for(ll i=0;i<=n;i++){
			ans+=1ll*((n-i)&1?-1:1)*C(n,i)*fac[i];
		}
		cout<<ans<<endl;
	}
    //Time_test();
}




以上是关于不容易系列之一的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1465 不容易系列之一(错排模板)

题目1451:不容易系列之一

P - 不容易系列之一

错排公式 不容易系列之一

HDU-1465-不容易系列之一(容斥)

不容易系列之一