【循环矩阵乘优化DP】BZOJ 2510 弱题
题目大意
有 \(M\) 个球,一开始每个球均有一个初始标号,标号范围为 \(1\) ~ \(N\) 且为整数,标号为 \(i\) 的球有 \(a_i\) 个,并保证 \(\sum a_i = M\)。
每次操作等概率取出一个球(即取出每个球的概率均为 \(1\over M\)),若这个球标号为 \(k\ (k < N)\),则将它重新标号为 \(k+1\);若这个球标号为 \(N\),则将其重标号为 \(1\)。(取出球后并不将其丢弃)
现在你需要求出,经过 \(K\) 次这样的操作后,每个标号的球的期望个数。
数据范围
\(N ≤ 1000, M ≤ 100,000,000, K ≤ 2,147,483,647\)。
思路
第一次见到循环矩阵优化 dp 的套路,记录一下。
转移方程很好得到,设 \(f[i][j]\) 表示到第 \(i\) 轮 \(j\) 编号的球的期望个数,转移方程就是
\]
\]
通过 \(K\) 的范围的提示,我们冲一个矩阵快速幂即可,时间效率 \(O(n^3\log K)\)
\(n\leq 1000\)
那没事了。
假设 \(n=4\),我们构造出转移矩阵:
\begin{matrix}
f[i-1][1] & f[i-1][2] & f[i-1][3] & f[i-1][4]
\end{matrix}
\right]
\times
\left[
\begin{matrix}
\cfrac{m-1}{m} & \cfrac{1}{m} & 0 & 0 \\
0 & \cfrac{m-1}{m} & \cfrac{1}{m} & 0 \\
0 & 0 & \cfrac{m-1}{m} & \cfrac{1}{m} \\
\cfrac{1}{m} & 0 & 0 & \cfrac{m-1}{m}
\end{matrix}
\right]
=
\left[
\begin{matrix}
f[i][1] & f[i][2] & f[i][3] & f[i][4]
\end{matrix}
\right]
\]
我们发现转移矩阵是一个循环矩阵。
那么这个矩阵满足什么性质呢?
我们设第一排的第 \(i\) 个数为 \(k[i]\),我们以 \(k[1]\) 为例:
\]
我们将其对应到第一行的元素,得到:
\]
很容易看出性质:
\]
所以我们只需要记录第一行的状态,用 \(O(n^2\log K)\)转移即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,m,K;
struct Mat{
double a[maxn];
Mat(){
memset(a,0,sizeof(a));
}
friend inline Mat operator *(register const Mat& A,register const Mat& B){
Mat C;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++)
C.a[(i+j-2)%n+1]+=A.a[i]*B.a[j];
return C;
}
}ans,base;
inline int read(){
int x=0;bool fopt=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')fopt=0;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-48;
return fopt?x:-x;
}
inline void qpow(int b){
while(b){
if(b&1)ans=ans*base;
base=base*base;
b>>=1;
}
}
int main(){
n=read();m=read();K=read();
for(int i=1;i<=n;i++)
ans.a[i]=read();
base.a[1]=1.0*(m-1)/m;
base.a[2]=1.0/m;
qpow(K);
for(int i=1;i<=n;i++)
printf("%.3lf\n",ans.a[i]);
return 0;
}
【循环矩阵乘优化DP】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]弱题
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 419 Solved: 226[Submit][Status][Discuss] D ...
- bzoj 2510: 弱题 概率期望dp+循环矩阵
题目: Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M) ...
- bzoj 2510 弱题 矩阵乘
看题就像矩阵乘 但是1000的数据无从下手 打表发现每一行的数都是一样的,只不过是错位的,好像叫什么循环矩阵 于是都可以转化为一行的,O(n3)->O(n2)*logk #include< ...
- 【BZOJ 2510】 2510: 弱题 (矩阵乘法、循环矩阵的矩阵乘法)
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 374 Solved: 196 Description 有M个球,一开始每个球均有一 ...
- CodeForces621E 快速矩阵幂优化dp
有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...
- 形态形成场(矩阵乘法优化dp)
形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
随机推荐
- Kubernetes-16:一文详解ServiceAccount及RBAC权限控制
一.ServiceAccount 1.ServiceAccount 介绍 首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) ...
- Linux:apache目录结构和配置文件详解
bin目录下的常见命令 conf目录 htdocs目录 logs目录 httpd.conf文件解析. 如果后期自己新创建了新的站点目录,就要重新增加对应的目录权限配置 extra/目录下配置文件解析 ...
- NetCore微服务实战体系:日志管理
一. 起始 进入NetCore时代,日志的使用有了很大的变化,因为跨平台以及虚拟化技术的使用,日志不能够再像Framework的方式直接记录在文本,文本其实也可以,但是日志的管理以及查看都不太方便.L ...
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
- [计算机网络]TCP/IP协议-运输层
TCP/IP体系结构 TCP/IP四层协议 五层协议 协议 作用 应用层 应用层 HTTP超文本传输协议.FTP文件传输协议 - 运输层 运输层 TCP(面向连接的,可靠的).UDP(无连接的,不保证 ...
- tomact在windows系统下安装
一.下载 下载地址: https://tomcat.apache.org/download-90.cgi 7,8,9的版本都可以下,这里下载最新版本 注意:Binary是编译好的,可以直接使用的版本, ...
- C#实现创建、编辑NX表达式
在NX8.5中使用C#编辑表达式中有个坑,part.Expressions.Edit该方法鲁棒性很差,当表达式有错时也能编辑成功(手动在NX中增加错误表达式会有弹框,无法创建,而该方法却可以,疑是bu ...
- springmvc 源码分析(一)-- DisparcherServlet的创建和注册到tomcat
一. servlet 3.0 的使用 1.1 环境搭建: servlet跟spring没有任何关系,我创建一个servlet可以不依赖spring,现在搭建一个纯的servlet项目,并实现简单的类似 ...
- 简述application.properties和application.yml 以及 @ConfigurationProperties 和@PropertySource @Value 和@ImportResource的用法,区别
问题: 如何在application.properties和application.yml中配置String,Date,Object,Map,List类型的属性,并且idea能提示 先写一个Perso ...
- 腾讯一面!说说ArrayList的遍历foreach与iterator时remove的区别,我一脸懵逼
本文基于JDK-8u261源码分析 1 简介 ArrayList作为最基础的集合类,其底层是使用一个动态数组来实现的,这里"动态"的意思是可以动态扩容(虽然ArrayList可 ...