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 ...
随机推荐
- Dire Wolf(区间DP)
Dire Wolf Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total ...
- 新升级!EasyNVR3.0功能概述--直播与录像
背景介绍: 对于摄像机直播已经是我们司空见惯的需求,但是,许多用户在现有的直播的基础上更有录像的需求,并且有关于录像的删除定时等录像计划的需求,更有客户不仅需要这些功能,还需要将这些功能集成到自身的业 ...
- nginx学习之压缩解压篇(七)
1.简介 压缩响应可以减少传输数据的大小,节省带宽.但过多的压缩会造成很大的处理开销.在发送给客户端之前,nginx会对响应做压缩,但是如果后端服务器已经 压缩过了,nginx就不再压缩. 2.开启压 ...
- TRansportation ANalysis and SIMulation System
https://www.fhwa.dot.gov/planning/tmip/transims/background.cfm?from=groupmessage
- Unity3D C#事件管理:EventManager
原文地址:http://bbs.9ria.com/thread-153258-1-1.html 原project地址:https://github.com/djandrew/UnityEventMan ...
- 8.Django模型类例子
这里定义4个模型 作者:一个作者有姓名 作者详情:包括性别,email,出生日期, 出版商:名称,地址,城市,省,国家,网站 书籍:名称,日期 分析: 作者详情和作者一对一的关系 一本书可以有多个作者 ...
- Linux c编程:I/O多路复用之epoll
前面介绍了select处理,这一章继续介绍另外一种I/O多路服用的机制:epoll.来比较下两种机制的不同点. select: 调用过程如下: (1)使用copy_from_user从用户空间拷贝fd ...
- 如何在ubuntun中安装intellij idea 2018并破解
相比eclipse软件,intellij idea的操作更方便.功能更多,几乎集成了所有的java框架. 安装步骤如下: 1 在https://www.jetbrains.com/idea/网站上下载 ...
- angular中按需加载js
按需加载估计是大家在使用angular之后最想解决的问题吧,因为angular的依赖机制,导致了必须在第一次加载的时候就加载所有js文件,小项目还好,稍大一点的项目如果有上百个js文件,不管是从效率还 ...
- LeetCode:柠檬水找零【860】
LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...