[BZOJ 2510]弱题
2510: 弱题
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 419 Solved: 226
[Submit][Status][Discuss]Description
有M个球,一开始每个球均有一个初始标号,标号范围为1~N且为整数,标号为i的球有ai个,并保证Σai = M。每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < N),则将它重新标号为k + 1;若这个球标号为N,则将其重标号为1。(取出球后并不将其丢弃)现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数。Input
第1行包含三个正整数N,M,K,表示了标号与球的个数以及操作次数。第2行包含N个非负整数ai,表示初始标号为i的球有ai个。Output
应包含N行,第i行为标号为i的球的期望个数,四舍五入保留3位小数。Sample Input
2 3 2
3 0Sample Output
1.667
1.333HINT
【样例说明】
第1次操作后,由于标号为2球个数为0,所以必然是一个标号为1的球变为标号为2的球。所以有2个标号为1的球,有1个标号为2的球。
第2次操作后,有1/3的概率标号为2的球变为标号为1的球(此时标号为1的球有3个),有2/3的概率标号为1的球变为标号为2的球(此时标号为1的球有1个),所以标号为1的球的期望个数为1/3*3+2/3*1 = 5/3。同理可求出标号为2的球期望个数为4/3。
【数据规模与约定】
对于10%的数据,N ≤ 5, M ≤ 5, K ≤ 10;
对于20%的数据,N ≤ 20, M ≤ 50, K ≤ 20;
对于30%的数据,N ≤ 100, M ≤ 100, K ≤ 100;
对于40%的数据,M ≤ 1000, K ≤ 1000;
对于100%的数据,N ≤ 1000, M ≤ 100,000,000, K ≤ 2,147,483,647。
题解
首先看题目我们可以猜到这是个概率DP...然后肯定能想到最朴素的做法 ($O(n)$转移期望值然后跑$k$次)
但是紧接着我们发现 $k$ 的范围极大...这时我们可以考虑矩阵乘法优化DP. 推出来的矩阵大概长这样:
\[\begin{bmatrix}
1-\frac{1}{m} & 0 & 0 & \dots & \frac{1}{m}\\
\frac{1}{m} & 1-\frac{1}{m} & 0 & \dots & 0\\
0 & \frac{1}{m} & 1-\frac{1}{m} & \dots & 0\\
\vdots & \vdots & \vdots & \ddots & \vdots\\
0 & 0 & 0 & \frac{1}{m} & 1-\frac{1}{m}
\end{bmatrix}\]
然后矩阵快速幂跑到 $O(n^3log(k))$ 的复杂度了233
然而我们又发现 $n$ 的范围 $O(n^3)$ 跑不过去...
观察转移矩阵, 我们发现这其实是个循环矩阵, 乘法可以转化成类似卷积的形式, 然后 $O(n^2)$ 求卷积就可以降到 $O(n^2log(n))$ 复杂度了OwO
参考代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=;
const int MAXK=; int n;
int m;
int k;
double x[MAXN];
double ans[MAXN];
double a[MAXN]/*[MAXN]*/;
double b[MAXN]/*[MAXN]*/; int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++){
scanf("%lf",ans+i);
}
a[]=1.0-1.0/m;
a[n]=1.0/m;
while(k>){
if((k&)==){
memcpy(x,ans,sizeof(ans));
for(int i=;i<=n;i++){
ans[i]=;
for(int j=;j<=n;j++){
ans[i]+=x[j]*a[((j-i+n)%n)+];
}
}
}
memset(b,,sizeof(b));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
b[i]+=a[((i-j+n)%n)+]*a[j];
}
}
memcpy(a,b,sizeof(b));
k>>=;
}
for(int i=;i<=n;i++){
printf("%.3lf\n",ans[i]);
}
return ;
}
Backup
[BZOJ 2510]弱题的更多相关文章
- bzoj 2510: 弱题 循环矩阵
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 124 Solved: 61[Submit][Status][Discuss] De ...
- BZOJ 2510: 弱题( 矩阵快速幂 )
每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献 用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK) --- ...
- bzoj 2510 弱题 矩阵乘
看题就像矩阵乘 但是1000的数据无从下手 打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵 于是都可以转化为一行的,O(n3)->O(n2)*logk #include< ...
- bzoj 2510: 弱题 概率期望dp+循环矩阵
题目: Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M) ...
- 【循环矩阵乘优化DP】BZOJ 2510 弱题
题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\) ...
- 【BZOJ 2510】 2510: 弱题 (矩阵乘法、循环矩阵的矩阵乘法)
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 196 Description 有M个球,一开始每个球均有一 ...
- bzoj 前100题计划
bzoj前100题计划 xz布置的巨大的坑.. 有空填题解... 1002 轮状病毒 用python手动matrixtree打表. #include<bits/stdc++.h> #def ...
- 【BZOJ2510】弱题 期望DP+循环矩阵乘法
[BZOJ2510]弱题 Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球 ...
- 「BZOJ2510」弱题
「BZOJ2510」弱题 这题的dp式子应该挺好写的,我是不会告诉你我开始写错了的,设f[i][j]为操作前i次,取到j小球的期望个数(第一维这么大显然不可做),那么 f[i][j]=f[i-1][j ...
随机推荐
- C++实现顺序查找,折半查找,插值查找
1.顺序查找 从数组起始扫描到数组结尾,判断该索引数组是否和关键字相等,成功返回1 代码如下: //顺序查找 int seqSearch(int *array, int low, int high, ...
- C# 中的隐式类型转换(运算时的隐式转换)和显示类型转换
区别: 隐式转换失败编译会报错. 显示转换有可能精度丢失. 根据项目的编译设置,显示转换溢出可能会报错,如果设置溢出且未使用checked检查,运行时如果发生溢出会产出未知的计算结果. 在数字运算时, ...
- 将字符串 “ hello word,你 好 世 界 ! ” 两端空格去掉并且将其中的其他所有空格替换成一个空格 输出结果为“hello word,你 好 世界”
string str = " hello word,你 好 世 界 ! "; string msg = str.Trim(); //去掉首尾空格 //使用split分割字符串,st ...
- ADO MFC SQL2000
对于初学VC的朋友来说,连接数据库其实是一件不容易的事情.记得我当时为了与数据库连接上,找了好多资料,上网看了好多文章,都没有解决这个问题.后 来,有个网友帮我解决了,我再次表示感谢.为了后来VC初学 ...
- [FORWARD]ODBC 各种数据库连接串
Overview Generally, one of the first steps when you are trying to work with databases is open it. Yo ...
- java语言的各种输入情况(ACM常用)
1.只输入一组数据: Scanner s=new Scanner(System.in); int a=s.nextInt(); int b=s.nextInt(); 2.输入有多组数据,没有说明输入几 ...
- K:二叉查找树(BST)
相关介绍: 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tre ...
- OpenStack IceHouse 部署 - 1 - 架构说明
参考架构 Architecture from OpenStack Install Guide Reference Architecture Network Isolation 在本次部署中,我们采用了 ...
- sql语句中as的意思是什么?
as 一般用在两个地方,一个是query的时候,用来重新指定返回的column(列) 名字如:一个table 有个column叫 id, 我们的query是select id from table1. ...
- 通用CSS命名规范
一.文件命名规范 样式文件命名主要的 master.css布局,版面 layout.css专栏 columns.css文字 font.css打印样式 print.css主题 themes.css [/ ...