bzoj 2510: 弱题 概率期望dp+循环矩阵
题目:
Description
有M个球,一开始每个球均有一个初始标号,标号范围为1~N且为整数,标号为i的球有ai个,并保证Σai = M。
每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < N),则将它重新标号为k + 1;若这个球标号为N,则将其重标号为1。(取出球后并不将其丢弃)
现在你需要求出,经过K次这样的操作后,每个标号的球的期望个数。
题解:
神题一个.
首先我们发现没有办法直接对整体进行dp
所以我们先单独考虑一个球.
我们设\(p[i][j]\)表示一个球在i轮后编号向右移动了\(j\)位
简单理解就是\(pos\)变成了\((pos+1)%n\)
那么我们有: \(p[i][j] = p[i-1][j]*\frac{m-1}{m} + p[i-1][j-1]*\frac{1}{m}\)
那么我们有答案\(ans[i] = \sum_{j=0}^{n-1}a[(i-j+n)%n]*p[k][j]\)
所以只要我们计算出\(p[][]\)即可\(O(n^2)\)统计答案
然后关键就是处理\(p[][]\)
但是我们发现\(k\)大的要死,明摆着让我们写矩乘
但是\(n \leq 1000\)矩阵乘法无法直接出解。
但是我们仔细观察一下我们的转移矩阵,发现这个矩阵居然是一个循环矩阵!
所以我们可以直接用\(O(n^2)\)的复杂度完成循环矩阵的乘法。
所以可以将复杂度降到\(O(n^2logk + nlogn)\)
后面的\(nlongn\)是因为可以用FFT计算卷积实现答案的统计.
但是人懒,直接写的n^2的统计,复杂度同阶.
而且貌似n^2的循环展开比FFT还要快.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 1024;
int a[maxn];
struct Matrix{
double s[maxn];
int n;
void clear(int n){
this->n = n;
memset(s,0,sizeof s);
}
friend Matrix operator * (Matrix a,Matrix b){
Matrix c;c.clear(a.n);
for(int j=0;j<c.n;++j){
for(int k=0;k<c.n;++k){
c.s[j] += a.s[k]*b.s[(j-k+c.n)%c.n];
}
}
return c;
}
}ori,mul;
double anss[maxn];
int main(){
int n,m,k;read(n);read(m);read(k);
for(int i=0;i<n;++i) read(a[i]);
ori.clear(n);
mul.clear(n);
ori.s[0] = 1.0;
mul.s[0] = 1.0*(m-1)/m;
mul.s[1] = 1.0/m;
int p = k;
for(;p;p>>=1,mul=mul*mul) if(p&1) ori = ori*mul;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
anss[i] += a[(i-j+n)%n]*ori.s[j];
}
}
for(int i=0;i<n;++i){
printf("%.3lf\n",anss[i]);
}
return 0;
}
bzoj 2510: 弱题 概率期望dp+循环矩阵的更多相关文章
- bzoj 2510: 弱题 循环矩阵
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 124 Solved: 61[Submit][Status][Discuss] De ...
- [BZOJ 2510]弱题
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 419 Solved: 226[Submit][Status][Discuss] D ...
- BZOJ 2510: 弱题( 矩阵快速幂 )
每进行一次, 编号为x的数对x, 和(x+1)%N都有贡献 用矩阵快速幂, O(N3logK). 注意到是循环矩阵, 可以把矩阵乘法的复杂度降到O(N2). 所以总复杂度就是O(N2logK) --- ...
- 【循环矩阵乘优化DP】BZOJ 2510 弱题
题目大意 有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) - \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\) ...
- 【BZOJ2510】弱题 期望DP+循环矩阵乘法
[BZOJ2510]弱题 Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球 ...
- bzoj 2510 弱题 矩阵乘
看题就像矩阵乘 但是1000的数据无从下手 打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵 于是都可以转化为一行的,O(n3)->O(n2)*logk #include< ...
- bzoj 4832 抵制克苏恩 概率期望dp
考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的 ...
- 【BZOJ 2510】 2510: 弱题 (矩阵乘法、循环矩阵的矩阵乘法)
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 196 Description 有M个球,一开始每个球均有一 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
随机推荐
- Struts2+hibernate+spring 配置事物
今天自信看了看hibernate的事物配置问题,转载了其他人的日志,仅用来学习. struts+hibernate+spring事务配置 (2009-01-14 21:49:47) 转载▼ 标签: i ...
- Android获取系统外置存储卡路径的方法
android系统可通过Environment.getExternalStorageDirectory()获取存储卡的路径.可是如今有非常多手机内置有一个存储空间.同一时候还支持外置sd卡插入,这样通 ...
- mysql mariadb 乱码
mysql 创建临时表 CREATE TEMPORARY TABLE tmp_table SELECT COUNT(*) AS num FROM student_info GROUP BY LEFT( ...
- 学习Filter
http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html Filter 介绍: 它主要用于对用户请求进行预处理,也可以对HttpSe ...
- win8 office 2013激活方法
先在用win8的人越来越多了,可是某些软件对win8不太友好(也可以说是win8对某些低版本软件不友好),office注册软件office toolkit就是,我在win7上使用2.4.1版本没有问题 ...
- 高性能javascript学习总结(2)--DOM编程
我们知道,对DOM的操作都是非常的耗性能的,那么为什么会耗性能呢? 文档对象模型(DOM)是一个独立于语言的,使用 XML和 HTML 文档操作的应用程序接口(API).在浏览器中,主要与 ...
- 人生要golang
第一篇 : 初识golang 第二篇 : 下载及安装 未完待续 ............................................
- windows下SecureCRT无法使用backspace(空格键)和上下左右键
在使用SecureCRT登陆liunx(我的为CenterOS)系统,发现删除(backspace)键.和上下左右键不起作用,郁闷了很久没有找到解决办法, 今天终于看到了一篇有用的文章,在此记录一下! ...
- MOOC 数据结构 01-复杂度3 二分查找
01-复杂度3 二分查找(20 分) 本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如 ...
- uCGUI 按键窗口切换机制(更新篇)
在之前文章中,讲述了一个低内存使用量的的窗口切换机制.有人会问,低内存使用量是多低呢,我这里举个例子.我有一个项目中使用到本切换机制,128*64的单色屏,初步计算有105个窗口(后面还会增加),总内 ...