「BZOJ2510」弱题

这题的dp式子应该挺好写的,我是不会告诉你我开始写错了的,设f[i][j]为操作前i次,取到j小球的期望个数(第一维这么大显然不可做),那么

f[i][j]=f[i-1][j](累加)+1*$\frac{f[i-1][j-1]}{M}$ - 1* $\frac{f[i-1][j]}{M}$(前i-1次拿到的j-1号球转化为j号球)以及(前i-1次拿到的j号球转化为j+1号球)注意1要特殊考虑。移项得

$f[i][j]=(1-1/m)*f[i-1][j]+(1/m)*f[i-1][j-1]$,开始并没有发现他和矩阵快速幂有啥关系,因为矩阵乘的式子是$f[i][j]=∑f[i][k]*f[k][j]$,但是想想矩阵快速幂是怎么优化肥不拉几数列的:

而上面的dp式子化一下和这个很像:第一维发现并没有什么卵用,而且k这么大显然是快速幂的指数啊,所以把它干掉,就成了f[j]=(1-1/m)*f[j]+(1/m)*f[j-1],以n=4为例初始矩阵和转移矩阵分别是这样的:

(为啥没有对齐啊)然后就可以用矩阵快速幂优化递推,复杂度$n^3logk$,然而n是一千啊,时间上不可过,而且即使不考虑时间,1000*1000的数组传参直接RE(亲测),

但是仔细看看转移矩阵有没有什么特点?它是一个循环矩阵!!!所以只需要存下第一行,矩阵乘的时候以$n^2$的复杂度重构两个数组,然后以$n^2$的复杂度计算ans第一行。

#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std;
struct jz
{
double m[2][1010];
}cs;
double tmpa[1010][1010],tmpb[1010][1010];
int n,m,k;
jz operator * (const jz &a,const jz &b)
{
jz ans;
memset(ans.m,0,sizeof(ans.m));
memset(tmpa,0,sizeof(tmpa));
memset(tmpb,0,sizeof(tmpb));
for(int j=1;j<=n;j++)tmpa[1][j]=a.m[1][j],tmpb[1][j]=b.m[1][j];
for(int i=2;i<=n;i++)
for(int j=1;j<=n;j++)
if(j==1)tmpa[i][j]=tmpa[i-1][n], tmpb[i][j]=tmpa[i-1][n];
else tmpa[i][j]=tmpa[i-1][j-1],tmpb[i][j]=tmpb[i-1][j-1];
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
ans.m[1][j]+=tmpa[1][k]*tmpb[k][j];
return ans;
}
jz operator ^ (jz &a,int &b)
{
jz ans=a,tem=a;b--;
while(b)
{
if(b&1)ans=ans*tem;
tem=tem*tem;
b=b>>1;
}
return ans;
}
double a[1010],f[1010];
signed main()
{
// freopen("in.txt","r",stdin); cin>>n>>m>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
cs.m[1][1]=(double)(1-1.0/m);
cs.m[1][2]=(double)1.0/m;
cs=cs^k;
memset(tmpa,0,sizeof(tmpa));
for(int j=1;j<=n;j++)tmpa[1][j]=cs.m[1][j];
for(int i=2;i<=n;i++)
for(int j=1;j<=n;j++)
if(j==1)tmpa[i][j]=tmpa[i-1][n];
else tmpa[i][j]=tmpa[i-1][j-1];
for(int i=n;i;i--)
{
for(int j=1;j<=n;j++)
f[i]+=a[j]*tmpa[n-i+1][n-j+1];
}
for(int i=1;i<=n;i++)
printf("%0.3lf\n",f[i]);
}

「BZOJ2510」弱题的更多相关文章

  1. 「BZOJ2510」弱题(矩阵乘法,降维)

    有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球的概率均为1/M),若这个球标号为k(k < ...

  2. 【BZOJ2510】弱题 期望DP+循环矩阵乘法

    [BZOJ2510]弱题 Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球 ...

  3. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...

  4. 【BZOJ2510】弱题

    题目大意 有\(M\)个球,一开始每个球均有一个初始标号,标号范围为\(1-N\)且为整数,标号为i的球有\(a_i\)个,并保证\(\sum a_i=M\). 每次操作等概率取出一个球(即取出每个球 ...

  5. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  6. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  7. LibreOJ #2036. 「SHOI2015」自动刷题机

    #2036. 「SHOI2015」自动刷题机 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 曾经发明了信号增幅仪的发明家 SHTSC 又公开 ...

  8. 「NOIP2009」Hankson 的趣味题

    Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...

  9. Solution -「基环树」做题记录

    写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...

随机推荐

  1. 独立版的 Asio安装与使用

    Asio分为独立版和Boost版.两者使用方法基本一致,只是头文件不同.Boost版是作为Boost的子库提供的. 因为Asio的组织形式为hpp文件(不同一般的C++项目区分头文件.h和源文件.cp ...

  2. Flask中的session机制

    cookie和sessioncookie:网站中,http请求是无状态的,第一次和服务器连接后并且登陆成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是解决了改问题,第一次 ...

  3. python基础--类的基础使用

    什么是面向对象: 面向对象是一种编程思想,其中的核心是对象,程序是一系列对象的集合,程序员负责调度控制这些对象来交互着完成某些任务. 在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者 面向 ...

  4. day37 02-Hibernate二级缓存:二级缓存的散装数据

    一级缓存存放的是对象的地址.把对象的地址缓存下来了.二级缓存里面存放的是对象的散装数据.你再去获取的时候,因为一级缓存的生命周期结束了,它会从二级缓存中获取.从二级缓存中获取,因为它又会得到一个对象. ...

  5. Dijkstra,floyd,spfa三种最短路的区别和使用

    这里不列举三种算法的实现细节,只是简单描述下思想,分析下异同 一 Dijkstra Dijkstra算法可以解决无负权图的最短路径问题,只能应付单源起点的情况,算法要求两个集合,开始所有点在第二个集合 ...

  6. 【洛谷】P1888 三角函数

    P1888 三角函数 题目描述 输入一组勾股数a,b,c(a≠b≠c),用分数格式输出其较小锐角的正弦值.(要求约分.) 输入输出格式 输入格式: 一行,包含三个数,即勾股数a,b,c(无大小顺序). ...

  7. LAMP标准化安装

    操作系统说明: 操作系统 版本 linux red hat release 6.4 关键软件包说明: 软件包 版本 目录 运行用户 httpd-2.2.27.tar.gz 2.2.27 /usr/lo ...

  8. 浅谈mybatis中#{}和${}的区别

    #{}:表示占位符,如果获取简单类型,#{}中可以使用value或其它名称.有效防止sql注入.使用#{}设置参数无需考虑参数的类型. 如果使用#{}比较日期字段,select* from table ...

  9. Ajax--PHP+JQuery+Ajax解析json、XML数据、加载页面

    一.JQuery+Ajax用get.post方式提交和请求数据 知识要点: $('#userName').blur(function () { var txt = $(this).val(); $.a ...

  10. 【JZOJ3214】【SDOI2013】方程

    ╰( ̄▽ ̄)╭ 给定方程 X1+X 2+-+Xn=m 我们对第 1.. n1 个变量 进行一些限制 : X1≤A1 X2≤A2 - Xn1 ≤An1 我们对第 n1+1.. n1+1.. n1+ n2 ...