【洛谷P3600】 随机数生成器

https://www.luogu.org/problem/show?pid=3600#sub (题目链接)

题意

  一个$n$个数的序列,里面每个数值域为$[1,X]$。给$q$个区间,每个区间的权值为这段区间里面的最小的数,然后算出了一个$ans=min(q_i)$,问$ans$的期望大小。

Solution

  md,太久没写题了,菜的抠脚了已经。

  官方题解写的挺好的:https://www.luogu.org/discuss/show?postid=7867

细节

  删除包含区间。

代码

// luogu3600
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=2010,MOD=666623333;
int n,m,X,Q;
LL f[maxn],s[maxn],inv[maxn],ans;
struct data {int l,r;}q[maxn],t[maxn];

bool cmp(data a,data b) {
	return a.l==b.l ? a.r<b.r : a.l<b.l;
}
LL power(LL a,LL b) {
	LL res=1;
	while (b) {
		if (b&1) (res*=a)%=MOD;
		b>>=1;(a*=a)%=MOD;
	}
	return res;
}
int main() {
	scanf("%d%d%de",&n,&X,&Q);
	for (int i=1;i<=Q;i++) scanf("%d%d",&q[i].l,&q[i].r);
	sort(q+1,q+1+Q,cmp);
	for (int i=1;i<=Q;i++) {
		while (q[m].r>=q[i].r && m) m--;
		if (q[i].l>q[m].l && q[i].r>q[m].r) q[++m]=q[i];
	}
	for (int l=1,r=0,i=1;i<=n;i++) {
		while (r<m && q[r+1].l<=i && i<=q[r+1].r) r++;
		while (l<=m && q[l].r<i) l++;
		t[i]=(data){l,r};
	}
	f[0]=inv[0]=1;
	for (int x=1;x<=X;x++) {
		LL T=power(X,MOD-2)*(x-1)%MOD,P=(1-T+MOD)%MOD,B=power(P,MOD-2),K=1,S=1,sum=0;
		for (int i=1;i<=n;i++) inv[i]=inv[i-1]*B%MOD;
		for (int p=0,i=1;i<=n;i++,(K*=P)%=MOD) {
			for (;p<i && t[p].r<t[i].l-1;p++) (S+=MOD-inv[p]*f[p]%MOD)%=MOD;
			f[i]=S*K%MOD*T%MOD;
			(S+=f[i]*inv[i]%MOD)%=MOD;
		}
		K=1;
		for (int i=n;i>=1;i--,(K*=P)%=MOD) if (t[i].r==m) (sum+=f[i]*K%MOD)%=MOD;
		(ans+=(1-sum+MOD))%=MOD;
	}
	printf("%lld",ans);
	return 0;
}
时间: 2024-10-21 08:49:37

【洛谷P3600】 随机数生成器的相关文章

P3600 随机数生成器

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:洛谷3600 正解:概率DP 解题报告: 官方题解:戳这里 考虑最朴素的计算式就是:$\sum_{i=1}^{x} i*P(ans=i) $为所求. 上式又等于$\sum_{i=1}^{x} P(ans>=i)$,这个可以理解成对于$j>=i$

[题解]洛谷比赛『期末考后的休闲比赛2』

[前言] 这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解.(我才不会告诉你我跑去学数据结构了) T1 区间方差 (就不贴题好了) 首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差): (s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数) 用二项式定理完全平方公式可得: 再次展开: 另外,再代入以下这个 得到了: 然后继续吧.. 然后duang地一声合并同类项,于是我们得到了: 然后可以高

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

[BZOJ]3671 随机数生成器(Noi2014)

洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子. 第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M 的排列来填入她 N 行 M 列的棋盘,并且小H在初始的 N×M 次交换操作后,又进行了 Q 次额外的交换操作. 接下来 Q 行,第 i 行包含两个整数 u_i,vi,表示第 i 次额外交换操作将交换 T(ui )和 T(v_i