博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 3622]已经没有什么好害怕的了
阅读量:5244 次
发布时间:2019-06-14

本文共 1981 字,大约阅读时间需要 6 分钟。

Description

给出 \(n\) 个数 \(a_i\) ,以及 \(n\) 个数 \(b_i\) ,要求两两配对使得 \(a>b\) 的对数减去 \(a<b\) 的对数等于 \(k\)

\(0\leq k\leq n\leq 2000\) ,保证 \(a,b\) 无相同元素。

Solution

我们假设 \(a>b\) 对数为 \(x\) ,可以求得 \(x=\frac{n+k}{2}\)

我们令 \(f_{i,j}\) 表示前 \(i\)\(a\) 中,选了 \(j\) 组满足 \(a>b\) 的方案数。

容易得到 \(\text{dp}\) 方程

\[f_{i,j}=f_{i-1,j}+(l_i-j+1)\times f_{i-1,j-1}\]

其中 \(l_i\) 表示从小到大排序后 \(b\)\(<a_i\) 的最靠后一个数。

我们记 \(g_i=f_{n,i}\times (n-i)!\) 即满足 \(a>b\) 的组数 \(\geq i\) 的方案数,再令 \(f_i\) 表示恰好满足 \(a>b\) 的组数 \(= i\) 的方案数。

容易发现对于 \(i>j\) \(f_i\) 恰好在 \(g_j\) 中算了 \({i\choose j}\) 次。

那么存在

\[g(k)=\sum_{i=k}^n{i\choose k}f(i)\]

由二项式反演得

\[f(k)=\sum_{i=k}^n(-1)^{i-k}{i\choose k}g(i)\]

直接求解即可。

Code

#include 
using namespace std;const int N = 2000+5, yzh = 1e9+9;int n, k, a[N], b[N], l[N], f[N][N], fac[N], ifac[N], g[N];int C(int n, int m) {return 1ll*fac[n]*ifac[m]%yzh*ifac[n-m]%yzh; }void work() { scanf("%d%d", &n, &k); if ((n+k)&1) {puts("0"); return; } k = (n+k)/2; ifac[0] = ifac[1] = fac[0] = fac[1] = 1; for (int i = 2; i < N; i++) ifac[i] = -1ll*yzh/i*ifac[yzh%i]%yzh; for (int i = 2; i < N; i++) fac[i] = 1ll*fac[i-1]*i%yzh, ifac[i] = 1ll*ifac[i-1]*ifac[i]%yzh; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); sort(a+1, a+n+1); sort(b+1, b+n+1); int loc = 0; for (int i = 1; i <= n; i++) { while (loc < n && b[loc+1] < a[i]) ++loc; l[i] = loc; } 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] = (1ll*f[i-1][j]+1ll*f[i-1][j-1]*max(0, l[i]-j+1)%yzh)%yzh; } for (int i = 0; i <= n; i++) g[i] = 1ll*f[n][i]*fac[n-i]%yzh; int ans = 0; for (int i = k; i <= n; i++) if ((i-k)&1) (ans -= 1ll*C(i, k)*g[i]%yzh) %= yzh; else (ans += 1ll*C(i, k)*g[i]%yzh) %= yzh; printf("%d\n", (ans+yzh)%yzh);}int main() {work(); return 0; }

转载于:https://www.cnblogs.com/NaVi-Awson/p/9245071.html

你可能感兴趣的文章
【android】安卓的权限提示及版本相关
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
IOS基础学习
查看>>
PHP 导出 Excell
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
浅谈算法和数据结构: 一 栈和队列
查看>>
Java内部类详解
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
图论-次短路求法
查看>>
What's New for Visual C# 6.0
查看>>
ExtJs学习笔记之ComboBox组件
查看>>
关于收费软件
查看>>
getopt_long
查看>>
TensorFlow MNIST CNN 代码
查看>>
javascript之Style物
查看>>
JSON跨域解决方案收集
查看>>
SSH框架整合总结
查看>>
图的深度优先遍历
查看>>
C# 之 提高WebService性能大数据量网络传输处理
查看>>