首页 > 其他分享 >二项式反演

二项式反演

时间:2023-04-16 10:22:16浏览次数:45  
标签:dbinom ll 个数 long 反演 init 二项式 sum

\[g_n = \sum_{i=0}^n\dbinom{n}{i}f_n \]

\[f_n=\sum_{i=1}^{n}\dbinom{n}{i}g_n \]

\[g_i=\sum_{j=i}^{n} \dbinom{j}{i}f_j \]

\[f_i=\sum_{j=i}^{n}\dbinom{j}{i}(-1)^{j-i}g_j \]

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

给两个数列 \(a\), \(b\), 要求 \(a_i,b_i\) 两两匹配,使得 \(a_i>b_i\) 的个数减去 \(a_i<b_i\) 的个数等于 \(k\),求总方案数。

先将 \(a,b\) 排序,定义 \(f_{i,j}\) 为前 \(i\) 个 \(a[i]\) 中恰好有 \(j\) 个满足 \(a_i>b_i\) 的方案数,其他的均未匹配的方案数。

有 \(f_{i,j} = f_{i-1,j} + f_{i-1,j-1}(r_i-(j-1))\) 。

其中 \(r_i\) 为 \(b\) 中小于 \(a_i\) 的个数。

定义 \(g_i\) 为满足 \(a_j>b_j\) 的个数大于 \(i\) 的方案数, \(G_i\) 表示满足 \(a_j>b_j\) 的个数等于 \(i\) 的方案数。

可以发现 \(G_i\) 在 \(g_j\) (\(i>j\))中出现了 \(\tbinom{i}{j}\) 次。

\[g_i=f_{n,i}(n-i)! \]

\[g_i = \sum_{j=i}^{n}\dbinom{j}{i}G_j \]

\[G_i = \sum_{j=i}^{n}\dbinom{j}{i}(-1)^{j-i}g_j \]

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
inline ll Max(ll x, ll y){return x > y ? x : y;}
const ll N = 2001;
const ll mod = 1e9 + 9;
ll n, c[N][N], f[N][N], g[N], a[N], b[N], mx[N], fac[N];
void init_c(ll tt){
  c[0][0]=1;
  for(ll i = 1; i <= tt; i++){
    c[i][0]=1;
    for(ll j = 1; j <= tt; j++)
      c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;
  }
}
void init_fac(ll tt){
  fac[0] = 1;
  for(ll i = 1; i <= tt; i++)
    fac[i] = fac[i-1] * i % mod;
}
ll fu(ll x){return x&1?-1:1;}
int main(){
  ll k;
  cin>>n>>k;
  for(ll i = 1; i <= n; i++)
    cin >> a[i];
  for(ll i = 1; i <= n; i++)
    cin >> b[i];
  sort(a+1, a+n+1);
  sort(b+1, b+n+1);
  init_c(n);
  init_fac(n);
  f[0][0]=1;
  for(ll i = 1; i <= n; i++){
    mx[i] = lower_bound(b+1, b+n+1, a[i]) - b - 1;
    f[i][0] = f[i-1][0];
    for(ll j = 1; j <= i; j++)
      f[i][j] = (f[i-1][j] + f[i-1][j-1] * Max(0, (mx[i] - j + 1)) % mod) % mod;
  }
  ll x = (n + k) >> 1;
  if((n+k)%2)cout<<0<<endl, exit(0);
  ll ans = 0;
  for(ll i = x; i <= n; i++)
    ans = (ans + fu(i-x) * c[i][x] % mod * f[n][i] % mod * fac[n-i] % mod) % mod;
  cout << (ans % mod + mod) % mod << endl;
  return 0;
}

标签:dbinom,ll,个数,long,反演,init,二项式,sum
From: https://www.cnblogs.com/dadidididi/p/17322615.html

相关文章

  • 线性筛,整除分块,欧拉函数与莫比乌斯反演
    埃氏筛法说到筛质数,就不得不提到大名鼎鼎的埃氏筛法了思想非常简单,就是对于每一个素数pri[i],我们都把它的倍数筛去,譬如对于素数2来说,我们就把\(2*2,2*3,2*4,2*5....2*n\)的数全部筛掉代码voidzhishu(intn){ for(inti=2;i<=n;i++){ if(p[i]==0) for(intj=i*2;......
  • 莫比乌斯反演
    说到筛质数,就不得不提到大名鼎鼎的埃氏筛法了埃氏筛法思想非常简单,就是对于每一个素数pri[i],我们都把它的倍数筛去,譬如对于素数2来说,我们就把\(2*2,2*3,2*4,2*5....2*n\)的数全部筛掉代码voidzhishu(intn){ for(inti=2;i<=n;i++){ if(p[i]==0) for(intj=i*2;......
  • 容斥与反演技巧(二)
    年更大作FJOI2017矩阵填数\(\max=v\)拆成\(\lev\)和存在一个\(=v\),对第二个条件容斥发现变成\(<v\),离散化后对每个点求出上界直接算。复杂度\(O(n^32^n)\)。......
  • 莫比乌斯反演
    莫比乌斯反演引入莫比乌斯反演用处:对于一些函数\(f(n)\),如果比较难以求出它的值,但容易求出其倍数和或约束和\(g(n)\),则可以通过莫比乌斯反演简化运算。莫尼乌斯函数......
  • 二项式反演
    学习参照cmd的博客,知乎,oi-wiki,某神仙的博客组合恒等式\[\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}\\\binom{n}{n_1,n_2,\ldots,n_k}=\frac{(n_1+n_2+\ldots+n_k......
  • 【应用】Lagrange 反演应用
    证明鸽了,所以先开始应用篇。对于一元多项式\(F,G\)我们有Lagrange反演公式:\[n[x^n]F^k=k[w^{-k}]G^{-n}\]绝大多数情况我们都取\(k=1\)。其中多项式\(G\)为\(F......
  • 【洛谷】P2257 YY的GCD(莫比乌斯反演)
    原题链接题意\(T\)组询问,每次询问求:\[\sum_{i=1}^{n}\sum_{i=1}^{m}[\gcd(i,j)\inprime]\]\(T=10^4,n,m\leq10^7\)。思路不难想到枚举质数,将原式化简为:\[\sum......
  • 莫比乌斯反演 & 狄利克雷卷积
    大家好,我不会数学实锤了。文章内容较杂,分章节叙述了的大部分有关内容。为什么把这俩放一起?我不知道。积性函数积性函数:\(\foralla,b\),\(a\perpb\),如果一个函数\(f\)......
  • 浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥
    浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥目录浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥更......
  • <学习笔记> 关于二项式反演
    1容斥原理的式子:\[|A1∪A2∪...∪An|=\sum_{1≤i≤n}|Ai|−\sum_{1≤i<j≤n}|Ai∩Aj|+...+(−1)^{n−1}×|A1∩A2∩...∩An|\]一般来说不会直接用容斥原理这个式子,而是......