首页 > 其他分享 >P4859 已经没有什么好害怕的了

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

时间:2024-05-22 13:29:20浏览次数:15  
标签:long P4859 int 什么 害怕 i64 ret inv mod

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

二项式反演

看到恰好,求方案数,可以想到二项式反演。

套路钦定 \(k\) 组糖果比药片能量大,其他任意组合,这样的方案数记为 \(g_k\)。再设 \(f_k\) 表示恰好 \(k\) 组的糖果比药片能量大的方案数,现在要找到 \(g\) 和 \(f\) 之间的关系。容易推出 \(g_k=\sum_{i=k}^nC(i,k)f_k\)。

那么根据二项式反演,\(g_k=\sum_{i=k}^nC(i,k)f_i\Rightarrow f_k=\sum_{i=k}^n(-1)^{i-k}C(i,k)g_i\),现在的目的是求出 \(g_i\)。

对于比较元素大小的序列问题,可以将他们排序,这样子可能会得到更多性质,比如每个 \(a\) 比 \(b\) 大的位置(这里说成控制范围)都是一端前缀,并且 \(a_{i-1}\) 的控制范围包含于 \(a_i\) 。方案数考虑 dp,设 \(F_{i,j}\) 表示考虑到第 \(i\) 个,选择了 \(j\) 组 \(a>b\) 的方案数。那么转移写成:\(F_{i,j}=F_{i-1,j}+(r-i+1)\times F_{i-1,j-1}\)。\(r\) 表示 \(a_i\) 的控制范围。

那么得出 \(g_i=(n-i)!\times F_{n,i}\)。组合数计算即可。复杂度 \(O(n\log V)\)。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_back

using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 2e3 + 10, mod = 1e9 + 9;
i64 n, k, ans;
i64 a[N], b[N], f[N][N];
i64 qpow(i64 a, i64 b, i64 m) {
	i64 ret = 1;
	while(b) {
		if(b & 1) ret = ret * a % m;
		a = a * a % m;
		b >>= 1;
	}
	return ret;
}
struct BIN {
	i64 fac[N], inv[N];
	void init(int n) {
		fac[0] = 1;
		for(int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % mod;
		inv[n] = qpow(fac[n], mod - 2, mod);
		for(int i = n - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
	}
	i64 C(i64 n, i64 m) {
		if(n < m) return 0;
		return fac[n] * inv[m] % mod * inv[n - m] % mod;
	}
} comb;
void solve() {
	comb.init(N - 10);
	std::cin >> n >> k;
	k = (n + k) >> 1;
	for(int i = 1; i <= n; i++) {
		std::cin >> a[i];
	}
	for(int i = 1; i <= n; i++) {
		std::cin >> b[i];
	}
	std::sort(a + 1, a + n + 1);
	std::sort(b + 1, b + n + 1);
	int r = 1;
	f[0][0] = 1;
	for(int i = 1; i <= n; i++) {
		while(r <= n && a[i] > b[r]) r++; r--;
		f[i][0] = 1;
		for(int j = 1; j <= std::min(r, i); j++) {
			f[i][j] = (f[i - 1][j] + (r - j + 1) * f[i - 1][j - 1] % mod) % mod;
		}
	}
	for(int i = k; i <= n; i++) {
		ans = (ans + qpow(-1, i - k, mod) * comb.C(i, k) % mod * comb.fac[n - i] % mod * f[n][i] + mod) % mod;
	}
	std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	solve();

	return 0;
}

标签:long,P4859,int,什么,害怕,i64,ret,inv,mod
From: https://www.cnblogs.com/FireRaku/p/18206066

相关文章

  • TCP图文详解到底什么是三次握手四次挥手
    为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把......
  • 允许鼠标响应 css,pointer-events: auto; 和 pointer-events: all; 有什么区别,用哪个
    在CSS中,`pointer-events:auto;`和`pointer-events:all;`实际上并不存在`pointer-events:all;`这个值,因此不用考虑哪个更好。正确的用法是`pointer-events:auto;`。###`pointer-events`属性的概述`pointer-events`属性用于控制一个元素是否响应鼠标事件(如点击、悬停......
  • 文件加密软件有什么用?企业必须安装么?
    文件加密软件在企业中的应用是为了加强信息安全管理,保障核心资料的安全。这种软件的核心功能是对企事业单位的文件进行加密,使得无权限人员即使获取了文件也无法阅读内容,有效防止信息泄露。那么,文件加密软件到底有何用处,企业必须使用吗?让我们一探究竟。 文件加密软件的用处......
  • 什么是大模型?
    1.大模型的定义大模型是指具有大规模参数和复杂计算结构的机器学习模型。大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能,能够处理更加复杂的任务......
  • Linux基础——为什么Crash无法正常解析vmcore文件?
    一、宕机主机启动项中/boot/vmlinuz与debug工具生成的vmlinux的md5值是否一致?####3、通过buildID检查安装的debug和内核是否匹配:```#eu-readelf-n/boot/vmlinuz-3.10.0-1160.88.1.el7.x86_64Notesection[2]'.notes'of380bytesatoffset0x9cd284:OwnerDatas......
  • 用python开发一个类似的交互查询系统.用什么库方便?
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【fashjon】问了一个Python库的问题,问题如下:用python开发一个类似的交互查询系统.用什么库方便?二、实现过程这里【啥也不懂】给了一个指导:PYQT~~~这里【kimi】也给了一个答案,具体如下:Flask:Flask是一个轻量级的......
  • 为什么 mov sp, 32,debug程序,执行sp=32的位置,后面的代码就全乱了(在小甲鱼零基础汇编第6
    assumecs:code,ds:data,ss:stackdatasegmentdw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;用来作存放数据dataendsstacksegmentdw0,0,0,0,0,0,0,0;用来作栈的空间stackendscodesegmentstart:;设置数......
  • 解释下什么是面向对象?面向对象和面向过程的区别?
    面向对象(Object-OrientedProgramming,OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法组织在一起。在面向对象编程中,对象是类的实例,类定义了对象的属性(数据成员)和行为(方法)。对象可以互相通信,通过调用彼此的方法来完成任务。面向对象的四个核心原则是封装、继承、......
  • Unity性能优化:什么是内存泄露?
    内存泄漏是优化方面的名词,主要是由于不再使用的资源没有及时清理,来释放内存,造成内存的浪费,造成系统卡顿。 或者说,内存就像花呗,额度就这么多,有借要有还,而且手里有闲钱的时候就记得还,以保证内存的充足,如果占着不用,就会在其他需要使用的时候内存不足,就容易崩溃出现问题。 Unity......
  • 风险控制1、如果你的项目发布后失败,主要的原因会是什么?2、每个团队列出自己项目中目前
    项目发布失败的主要原因项目发布后失败可能由多种原因导致,这里列出几个主要的:需求不符合市场实际:产品没有满足目标市场的真实需求或者未能准确捕捉到用户的痛点。用户体验不佳:产品界面复杂难用,用户操作困难,导致用户流失。技术问题:产品存在缺陷或技术故障,影响功能实现或性能稳......