P4859 已经没有什么好害怕的了(二项式反演)

题目

思路

显然是恰好有\(\frac{n+k}{2}\)组\(a>b\)

令\(f(i,j)\)表示前\(i\)个糖果,已经有\(j\)组\(a>b\),剩下的没管的方案数

对\(a\)数组从小到大排序,设\(r_i\)表示比\(a_i\)小的\(b\)个数,那么\(r_i\)是递增的

有状态转移方程\(f(i,j) = f(i-1,j) + f(i-1,j-1) \times (r_i-j+1)\)

对于每个\(f(n,i)\),由于剩下的\(n-i\)对不知道大小情况,那么有\(f(n,i)\times (n-i)!\)种情况至少有\(i\)个匹配

设\(g_i\)表示恰好有\(i\)个匹配,那么\(f(n,i) \times (n-i)! = \Sigma_{j=i}^n C(j,i)\times g_i\)

二项式反演后就是\(g_i = \Sigma_{j=i}^n (-1)^{j-i}C(j,i)\times f(n,j)\times (n-j)!\)

#include<bits/stdc++.h>
#define N 2005
using namespace std;
typedef long long ll;
const ll mod = 1000000009;
int n,k,a[N],b[N],r[N];
ll f[N][N];
ll fac[N],ifac[N];

template <class T> inline T Max(T a,T b) { return a > b ? a : b; }
template <class T> inline T Min(T a,T b) { return a < b ? a : b; }
template <class T> void read(T &x)
{
    char c;int sign=1;
    while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
    while((c=getchar())>='0'&&c<='9') x=(x<<1)+(x<<3)+c-48; x*=sign;
}
ll qp(ll a,ll b) { ll ret=1; for(;b;b>>=1,a=a*a%mod) if(b&1) ret=ret*a%mod; return ret; }
ll C(int n,int m) { return n>=m ? fac[n]*ifac[m]%mod*ifac[n-m]%mod : 0; }
void init(int maxn)
{
    fac[0]=1; for(int i=1;i<=maxn;++i) fac[i]=fac[i-1]*i%mod;
    ifac[maxn]=qp(fac[maxn],mod-2);
    for(int i=maxn-1;i>=0;--i) ifac[i]=ifac[i+1]*(i+1)%mod;
}
int main()
{
    read(n);read(k);
    for(int i=1;i<=n;++i) read(a[i]);
    for(int i=1;i<=n;++i) read(b[i]);
    sort(a+1,a+n+1); sort(b+1,b+n+1);
    if((n+k)&1) { printf("0"); return 0; }
    for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j)
        r[i]+=(a[i]>b[j]);
    init(2000);
    f[0][0]=1;
    for(int i=1;i<=n;++i)
    {
        f[i][0]=f[i-1][0];
        for(int j=1;j<=i;++j) f[i][j] = (f[i-1][j] + f[i-1][j-1] * max(0,r[i]-j+1))%mod;
    }
    ll ans=0;
    k=(n+k)/2;
    for(int i=k;i<=n;++i) ans = (ans + ((i-k)&1 ? -1 : 1) * C(i,k) * f[n][i]%mod *fac[n-i]%mod)%mod;
    printf("%lld\n",(ans%mod+mod)%mod);
    return 0;
}

原文地址:https://www.cnblogs.com/Chtholly/p/11967407.html

时间: 2024-10-09 20:24:16

P4859 已经没有什么好害怕的了(二项式反演)的相关文章

luogu P4859 已经没有什么好害怕的了

嘟嘟嘟 题中给的\(k\)有点别扭,我们转换成\(a > b\)的对数是多少,这个用二元一次方程解出来是\(\frac{n + k}{2}\). 然后考虑dp,令\(dp[i][j]\)表示前\(i\)个数中,有\(j\)对满足\(a > b\)的方案数,转移的时候考虑这一组是否满足\(a > b\)即可:\(dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] * (num[i] - (j - 1))\).其中\(num[i]\)表示比\(a[i]\)小

[BZOJ 3622] 已经没有什么好害怕的了 手动反演

题意 给定两个大小为 n 的集合 A = {a[1], a[2], ..., a[n]} , B = {b[1], b[2], ..., b[n]} , 元素两两不同. 定义 L(A) 为 A 生成的排列的集合. 给定 K , 求 $\sum_{X \in L(A), Y \in L(B)} [\sum_{k = 1} ^ n [X_k > Y_k] - \sum_{k = 1} ^ n [X_k < Y_k] = K]$ . 1 <= n <= 2000, 0 <= K &

[bzoj3622]已经没有什么好害怕的了——容斥or二项式反演+DP

题目大意: 给定两个长度为\(n\)的序列,求有多少种匹配方式,使得\(a_i<b_i\)的个数恰好为\(k\)个. 思路: 据说是一道二项式反演的经典例题了. 首先如果要求正好等于\(k\)个的是不太好求的,我们可以考虑求出至少为\(k\)个的方案数. 首先先把两个序列都按照从小到大的顺序排好序,然后以序列\(b\)为对象dp. 我们设\(f_{i,j}\)表示前\(i\)个数里面强制确定了\(j\)个\(a_i<b_i\)关系的方案数,记\(c_i\)表示在\(a\)中有多少个数<\

数学模型

Catalan 卡特兰数 - 计数的映射方法的伟大胜利 [AHOI2012]树屋阶梯 鸡蛋饼 [SCOI2010]生成字符串 Stirling 斯特林数 容斥 容斥原理(翻译) UVA10325 The Lottery(状压+容斥) UVA11806 Cheerleaders SP4191 MSKYCODE - Sky Code [CQOI2015]选数(容斥+递推) [SCOI2010]幸运数字 莫比乌斯反演与筛法 \[g(n)=\sum_{d|n}f(d)\] \[f(n)=\sum_{d|

二项式反演及其应用

概念 二项式反演为一种反演形式,常用于通过 "指定某若干个" 求 "恰好若干个" 的问题. 注意:二项式反演虽然形式上和多步容斥极为相似,但它们并不等价,只是习惯上都称之为多步容斥. 引入 既然形式和多步容斥相似,我们就从多步容斥讲起. 我们都知道:$|A\cup B|=|A|+|B|-|A\cap B|$ ,这其实就是容斥原理. 它的一般形式为: $$|A_1\cup A_2\cup...\cup A_n|=\sum\limits_{1\le i\le n}|A_

反演魔术---二项式反演

反演是一种将难化易常用的手段 一般来说, 它有如下形式: \[ f(n) = \sum_{i = 0}^na_{ni}g(i)\g(n) = \sum_{i=0}^nb_{ni}f(i) \] 本质上来说, 反演是一个接线性方程组的过程 常见的反演有: 二项式反演 斯特林反演 莫比乌斯反演 单位根反演 二项式反演 形式一: \[ \ F(n)=\sum\limits_{i=0}^n(-1)^i\dbinom{n}{i}G(i)\G(n)=\sum\limits_{i=0}^n(-1)^i\dbi

[BZOJ 3622]已经没有什么好害怕的了(Dp+容斥原理)

Description 图片略 Solution 对啊,已经没有什么好害怕的了 没有头的麻美学姐还是很萌的(雾 排序预处理p[i]为b中小于a[i]的最大的数的标号 f[i][j]表示前i个糖果使得糖果大于药片的至少有j组 则f[i][j]=f[i-1][j]+f[i-1][j-1]*(p[i]-j+1) 容斥得g[j]=f[n][j]*(n-j)!-∑g[k]*C(j,k) (j+1<=k<=n) #include<iostream> #include<cstdio>

BZOJ 3622(已经没有什么好害怕的了-Dp+容斥原理)

3622: 已经没有什么好害怕的了 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 7  Solved: 6 [Submit][Status] Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output 4 HINT Source 2014湖北省队互测week2 PS:本题的数据中能量互不相同. 1.我们计算出糖果>药片的组数=k 2.我们计算出f[

TurboGate邮件网关归档功能,让您不再害怕“万一”

俗话说:不怕一万,就怕万一!日常生活中,对于发生概率极低的事情(也就是我们常说的"万一"),如果一旦发生了,往往都会产生灾难性的后果.例如:金融危机.9.11事件.马航失联-- 对于企业来说,哪些"万一"事件会影响到企业呢?如:重要数据丢失.业务信息系统崩溃-- 对于这些风险事件,可以说,没有任何一种措施可以彻底杜绝其发生,但是企业却能通过一些工具.管理方法最大程度地降低这些风险,或者当风险事件发生后,将不良影响降到最低. 在 信息化时代的今天,电子邮件已然成为企事