luogu P3600 随机数生成器【dp】
把期望改成方案数最后除一下,设h[i]为最大值恰好是i的方案数,那么要求的就是Σh[i]*i
首先包含其他区间的区间是没有意义的,用单调栈去掉
然后恰好不好求,就改成h[i]表示最大值最大是i的方案数,求Σ(h[i]-h[i-1])*i即可
然后考虑h怎么求,\( h[i]=\sum_{j=1}{n}ij*(m-1)^{n-j}*选j个点使得每个区间都有一个选中点 \)
设选j个点使得每个区间都有一个选中点为g[j],设f[i][j]为前i个必选i点一共选j个点的方案数,那么\( g[j]=\sum_{fr[i]==q}f[i][j] \)
然后考虑f怎么求,设fl[i]fr[i]分别是包含i的最左/右区间(如果没被包含就是左边第一个和右边第一个),\( f[i][j]=\sum_{fr[k]+1>=fl[i]} f[k][j-1] \),前缀和优化即可
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2005,mod=666623333;
int n,m,q,fl[N],fr[N],f[N][N],s[N][N],g[N],h[N],top,ans;
struct qwe
{
int l,r;
}a[N],b[N];
bool cmp(const qwe &a,const qwe &b)
{
return a.l<b.l||(a.l==b.l&&a.r<b.r);
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int ksm(int a,int b)
{
int r=1;
while(b)
{
if(b&1)
r=1ll*r*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return r;
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=q;i++)
a[i].l=read(),a[i].r=read();
sort(a+1,a+1+q,cmp);
for(int i=1;i<=q;i++)
if(i==1||a[i].l!=a[i-1].l)
{
while(top&&b[top].r>=a[i].r)
top--;
b[++top]=a[i];//cerr<<i<<endl;
}
q=top;
// for(int i=1;i<=q;i++)
// cerr<<b[i].l<<" "<<b[i].r<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=q;j++)
if(b[j].r>=i)
{
fl[i]=j;
break;
}
for(int j=q;j>=1;j--)
if(b[j].l<=i)
{
fr[i]=j;
break;
}
if(!fl[i])
fl[i]=fr[i]+1;
// cerr<<fl[i]<<" "<<fr[i]<<endl;
}
f[0][0]=s[0][0]=1;
top=0;
for(int i=1;i<=n;i++)
{
s[i][0]=s[i-1][0];
for(int j=1;j<=i;j++)
{
while(top<i-1&&fr[top]+1<fl[i])
top++;
f[i][j]=(s[i-1][j-1]-(top?s[top-1][j-1]:0)+mod)%mod;
s[i][j]=(s[i-1][j]+f[i][j])%mod;
}
}
for(int j=1;j<=n;j++)
for(int i=1;i<=n;i++)
if(fr[i]==q)
g[j]=(g[j]+f[i][j])%mod;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
h[i]=(h[i]+1ll*g[j]*ksm(i,j)%mod*ksm(m-i,n-j)%mod)%mod;
// cerr<<h[i]<<endl;
ans=(ans+1ll*(h[i]-h[i-1]+mod)*i%mod)%mod;
}
printf("%lld\n",1ll*ans*ksm(ksm(m,n),mod-2)%mod);
return 0;
}
luogu P3600 随机数生成器【dp】的更多相关文章
- Luogu P3600 随机数生成器
Luogu P3600 随机数生成器 题目描述 sol研发了一个神奇的随机数系统,可以自动按照环境噪音生成真·随机数. 现在sol打算生成\(n\)个\([1,x]\)的整数\(a_1...a_n\) ...
- Luogu P3600 随机数生成器(期望+dp)
题意 有一个长度为 \(n\) 的整数列 \(a_1, a_2, \cdots, a_n\) ,每个元素在 \([1, x]\) 中的整数中均匀随机生成. 有 \(q\) 个询问,第 \(i\) 个询 ...
- 洛谷P3600 随机数生成器(期望dp 组合数)
题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...
- 洛谷 P3600 - 随机数生成器(期望 dp)
题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...
- 洛谷P3600随机数生成器——期望+DP
原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...
- P3600 随机数生成器
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- luogu P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力
LINK:随机数生成器 观察数据范围还是可以把矩阵给生成出来的. 考虑如何求出答案.题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题. 所以要从大到小选数字 考虑选择一 ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
随机推荐
- xcode升级到6.0以后遇到的警告错误解决方法
Xcode 升级后,常常遇到的遇到的警告.错误,解决方法 从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了.1,警告:“xoxoxoxo” is depreca ...
- ios6.0,程序为横屏,出现闪退
本文转载至 http://blog.csdn.net/huanghuanghbc/article/details/10150355 ios6.0,程序为横屏,出现闪退 *** Terminatin ...
- GCJ Qualification Round 2016 D题
这题就是找规律.小数据还是挺容易想的.大数据得再深入分析一下. 题意挺绕的. 其实就是字符串转换.字符串只能有两种字母,L或G.给定K和C,就能通过规则生成目标字符串. 那么,如果知道了K和C,以及目 ...
- 九度OJ 1102:最小面积子矩阵 (DP、缓存、剪枝)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1666 解决:504 题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: ...
- Redis缓存服务搭建及实现数据读写 - Eric.Chen
发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached.Redis.mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下.由于小弟水 ...
- 基于BASYS2的VHDL程序——数字钟(改进版)
扩展到时分秒.加了入调时电路,但不知道为什么有两个按键不好使.而且不知道以何种方式假如按键消抖电路,因为加入后会多个时钟控制一个信号,物理不可实现.调试电路待解决.还有,四个数目管中间的那两个圆点怎么 ...
- win10环境变量path误删(windows找不到文件‘%windir%\systempropertiesadvanced.exe’)的解决办法
具体步骤如下:1. 首先重新启动电脑,点击开始按钮,选择电源,此时按住键盘上的shift键,再点击“重启”,选择疑难解答->再选择高级选项->再选择启动设置->然后点击重启-> ...
- [练习]使用dx.bat、dexdump.exe、javap、Baksmali
PART0 这几个工具的关系可以这样描述: 用例: public class Hello { public int foo(int a , int b ) { return (a+b) * (a-b) ...
- luogu 3812 【模板】 线性基
线性基是一个支持在集合里插入数并查询最大子集异或值 #include<iostream> #include<cstdio> #include<cstring> #i ...
- Tinyplay
android里面的目录:external/tinyalsa 编译: 1. cd external/tinyalsa/ 2. vi Android.mk 3. mmm . 4. 拷贝出可执行文件 执行 ...