首页 > 其他分享 >洛谷 P3600 随机数生成器

洛谷 P3600 随机数生成器

时间:2023-01-14 09:11:20浏览次数:66  
标签:typedef 洛谷 res ll 生成器 long P3600 maxn sum

洛谷传送门

设 \(h_i\) 为所有询问最大值 \(\le i\) 的方案数,则 \(ans = \dfrac{\sum\limits_{i=1}^n i \times (h_i - h_{i-1})}{x^n}\)。

设 \(g_i\) 为在 \(1 \sim n\) 中选出 \(i\) 个点且每个询问区间都至少包含一个点的方案数,则 \(h_i = \sum\limits_{j=1}^n g_j \times i^j \times (m-i)^{n-j}\)。

发现区间若包含则可以舍去较长区间,则舍去后按左端点排序,右端点也是递增的。设 \(L_i\) 为能覆盖到 \(i\) 的最左区间,\(R_i\) 为能覆盖到 \(i\) 的最右区间,\(f_{i,j}\) 表示 \(1 \sim i\) 中选了 \(j\) 个点,且 \(i\) 必须选,使得所有左端点 \(\le i\) 的区间内都有点被选的方案数,则 \(f_{i,j} = \sum\limits_{R_k + 1 \ge L_i} f_{k,j-1}\),不难前缀和优化。那么 \(g_i = \sum\limits_{R_j = q} f_{j,i}\)。

总时间复杂度 \(O(n(n+m) \log n + q \log q)\)。

code
/*

p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy

*/

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 2020;
const ll mod = 666623333;

ll n, m, q, stk[maxn], top, L[maxn], R[maxn];
ll f[maxn][maxn], g[maxn][maxn], ff[maxn], gg[maxn];

struct node {
	ll l, r;
} a[maxn];

bool cmp(node a, node b) {
	return a.l < b.l || (a.l == b.l && a.r < b.r);
}

ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

void solve() {
	scanf("%lld%lld%lld", &n, &m, &q);
	for (int i = 1; i <= q; ++i) {
		scanf("%lld%lld", &a[i].l, &a[i].r);
	}
	sort(a + 1, a + q + 1, cmp);
	for (int i = 1; i <= q; ++i) {
		while (top && a[i].r <= a[stk[top]].r) {
			--top;
		}
		stk[++top] = i;
	}
	q = top;
	for (int i = 1; i <= top; ++i) {
		a[i] = a[stk[i]];
	}
	for (int i = 1, l = 1, r = 0; i <= n; ++i) {
		while (r < q && a[r + 1].l <= i) {
			++r;
		}
		while (l <= r && a[l].r < i) {
			++l;
		}
		L[i] = l;
		R[i] = r;
	}
	f[0][0] = g[0][0] = 1;
	for (int i = 1, k = 0; i <= n; ++i) {
		while (k < i - 1 && R[k] + 1 < L[i]) {
			++k;
		}
		for (int j = 1; j <= i; ++j) {
			f[i][j] = (g[i - 1][j - 1] - (k ? g[k - 1][j - 1] : 0) + mod) % mod;
		}
		for (int j = 0; j <= i; ++j) {
			g[i][j] = (g[i - 1][j] + f[i][j]) % mod;
		}
	}
	for (int i = 1; i <= n; ++i) {
		if (R[i] == q) {
			for (int j = 1; j <= n; ++j) {
				ff[j] = (ff[j] + f[i][j]) % mod;
			}
		}
	}
	ll ans = 0;
	for (int i = 1; i <= m; ++i) {
		for (int j = 1; j <= n; ++j) {
			gg[i] = (gg[i] + ff[j] * qpow(i, j) % mod * qpow(m - i, n - j) % mod) % mod;
		}
		ans = (ans + (gg[i] - gg[i - 1] + mod) * i % mod) % mod;
	}
	ans = ans * qpow(qpow(m, n), mod - 2) % mod;
	printf("%lld\n", ans);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,洛谷,res,ll,生成器,long,P3600,maxn,sum
From: https://www.cnblogs.com/zltzlt-blog/p/17051262.html

相关文章

  • 洛谷P7792 KRIZA 题解 C++
    洛谷P7792KRIZA题解C++题目概述:题目传送门Sisyphus在一个圆形的房间里,房间内有n扇锁着的门,他有n把钥匙,其中第i把钥匙对应第$v_i$扇门,遇到不匹配的钥匙就放......
  • 洛谷 P8077 [WC2022] 序列变换 题解
    题目链接。WC2023之前补一下WC2022的题,参考了官方题解。首先,把括号序列转化为二叉树,\(\texttt{(A)B}\)转为一个点的左子树是\(A\),右子树是\(B\)。相当于括号序列先......
  • 使用 HTML、CSS 和 JavaScript 制作的随机密码生成器
    ----上图  ------MVC创建的视图,视图名称为A@{Layout=null;}<!DOCTYPEhtml><styletype="text/css">*{margin:0;padding:0;......
  • 洛谷P1040. 加分二叉树
    题目描述设一个\(n\)个节点的二叉树tree的中序遍历为(\(1,2,3,…,n\)),其中数字\(1,2,3,…,n\)为节点编号。每个节点都有一个分数(均为正整数),记第\(i\)个节点的分数......
  • 洛谷P6599 「EZEC-2」异或【题解】
    题目大意有\(T\)组数据,每组数据给定两个\(l,n\in\mathbb{N*}\),构造一个长为\(l\),每个元素不超过\(n\)的数组令他为\(a\),要使\[\sum_{i=1}^l\sum_{j=1}^{i-1}a_i\oplu......
  • CQOI2007,洛谷P4710涂色
    题目描述假设你有一条长度为\(5\)的木版,初始时没有涂过任何颜色。你希望把它的\(5\)个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为\(5\)的字符串表示这个目......
  • springboot代码生成器
    packagecom.atguigu;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.generator.AutoGenerator;importcom.baomidou.mybatisplus.g......
  • 洛谷 P1434 [SHOI2002] 滑雪 首次markdown测试
    [SHOI2002]滑雪题目描述Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来......
  • 洛谷P1282 多米诺骨牌 【dp】
    参考:https://blog.csdn.net/qq_51354600/article/details/120623720题意给定\(n\)个多米诺骨牌,每个多米诺骨牌由上下两部分组成,每部分的点数为\(1\sim6\)中的某一个数......
  • Python 中的生成器实现原理
    1.如何生成一个巨大的序列1.1需求描述要求生成一个包含很多元素的序列,假设:存储1个整数需要4个字节现在要创建一个包含1G个整数的序列,从0到1*1024*1024*......