[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 ...
随机推荐
- 利用keepalived构建高可用MySQL-HA
关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对 ...
- JavaScript -- 定义二维数组
方法一:直接定义并且初始化,这种遇到数量少的情况可以用var _TheArray = [["0-1","0-2"],["1-1"," ...
- sql中字符串连接
有时候我们需要将由不同栏位获得的资料串连在一起,每一种数据库都提供一定的方法来达到这个目的,比如: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + ...
- throws 与 throw
摘录自:http://blog.csdn.net/ronawilliam/article/details/3299676 void doA() throws Exception1, Exception ...
- $emit子组件传出多个参数,如何在父组件中在接收所有参数的同时添加自定义参数
很多时候用$emit携带参数传出事件,并且又需要在父组件中使用自定义参数时,这时我们就无法接受到子组件传出的参数了. 找到了两种方法可以同时添加自定义参数的方法. 方法一:子组件传出单个参数时 ...
- replace替换,全局和局部替换
<script> var a=document.getElementById("introduce").innerHTML; var b=a.replace(/jone ...
- JS判断两个数是否能除尽
function judgeDivisor(m, n) { var num = {}; var i = 0; var x = parseInt(m / n); m = m % n; var resul ...
- django框架中form表单Post方法无法提交 Forbidden (403) CSRF verification failed. Request aborted.
问题如图: 解决方法: 在视图函数中引入并使用装饰器 from django.views.decorators.csrf import csrf_exempt @csrf_exempt
- js图片跟随鼠标移动
<div id="wrapper"><img src="http://images.cnblogs.com/cnblogs_com/rain-null/ ...
- <Android 应用 之路> 百度地图API使用(4)
前言 百度地图的定位功能和基础地图功能是分开的,使用的是另外的jar包和so库文件,详情请关注官网: 百度定位SDK 配置 下载对应的jar包和so库,然后移动到lib目录下 AS中注意事项 sour ...