DarkBZOJ4204

(题面来源)

[题目描述]

有\(m\)个球,一开始每个球均有一个初始标号,标号范围为\(1~n\)且为整数,标号为\(i\)的球有\(a_{i}\)个,并保证\(Σa_{i} = m\)。

每次操作等概率取出一个球(即取出每个球的概率均为\(\frac{1}{m}\)),若这个球标号为\(k(k < n)\),则将它重新标号为\(k + 1\);若这个球标号为\(n\),则将其重标号为\(1\)。(取出球后并不将其丢弃)

现在你需要求出,经过\(K\)次这样的操作后,每个标号的球的期望个数。

\(dp[i]:\)编号为\(i\)的球的个数

\(dp[i]=dp[i]+dp[i−1]∗\frac{1}{m}−dp[i]∗\frac{1}{m}\)

\(dp[i]=\frac{1}{m}dp[i-1]+\frac{m-1}{m}dp[i]\)

写成矩阵形式,发现是个循环矩阵(从第2行开始都是由前一行向右移一位得到的)

循环矩阵乘循环矩阵还是循环矩阵

所以只要记录第一行即可

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int MAXN=1005; int dp[MAXN];
int n,m,k; struct Matrix{
int N;
double a[MAXN];
friend Matrix operator * (Matrix a,Matrix b){
Matrix res;
res.N=a.N;
/*memset(res.a,0,sizeof res.a);
for(int i=1;i<=a.N;i++)
for(int j=1;j<=b.N;j++)
for(int i=1;i<=a.N;i++)
res.a[i][j]+=a.a[i][k]*b.a[k][j];*/
for(int i=1;i<=res.N;i++){
res.a[i]=0;
for(int j=1;j<=res.N;j++)
res.a[i]+=a.a[j]*b.a[(i-j+res.N)%res.N+1];
}
return res;
}
}; inline Matrix qpow(Matrix a,int b){
Matrix res;
res.N=a.N;
memset(res.a,0,sizeof res.a);
res.a[1]=1;
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
} int main(){
// freopen("asd.in","r",stdin);
n=read(),m=read(),k=read();
for(int i=1;i<=n;i++) dp[i]=read();
if(n==1){
printf("%d.000\n",dp[1]);
return 0;
}
Matrix t;
t.N=n;
memset(t.a,0,sizeof t.a);
t.a[1]=(double)(m-1)/m;
t.a[2]=(double)1.0/m;
t=qpow(t,k);
assert(t.N==n);
for(int i=1;i<=n;i++){
double ans=0;
for(int j=1;j<=n;j++)
ans+=(double)dp[j]*t.a[(i-j+t.N)%t.N+1];
printf("%.3lf\n",ans);
}
}

[BZOJ4204] 取球游戏(期望)的更多相关文章

  1. bzoj4204: 取球游戏

    好神啊.. 首先递推随便yy一下就行了 然后发现可以用矩阵优化,不过显然是n^3logk的,不资磁 于是就有了性质,这个转移矩阵显然是一个循环矩阵(并不知道) 循环矩阵乘循环矩阵还是循环矩阵 然后就可 ...

  2. nyist 518 取球游戏

    http://acm.nyist.net/JudgeOnline/problem.php?pid=518 取球游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 今 ...

  3. 取球游戏|2012年蓝桥杯B组题解析第十题-fishers

    (25')取球游戏 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出 ...

  4. 取球游戏_nyoj_518(博弈-蓝桥杯原题).java

    取球游戏 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 2   描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下 ...

  5. nyoj_518_取球游戏_201404161738

    取球游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个 ...

  6. 蓝桥杯 第三届C/C++预赛真题(10) 取球游戏(博弈)

    今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的数目必须是:1 ...

  7. hihoCoder offer 收割练习赛 74B 取球游戏

    Observations 存在取球策略使得每个四连通块可以只剩一个球:保证取走一个球后仍然是个四连通块. 定义新的[相邻]关系:两球在同一行中且所在行中二者之间无其他球,或者两球在同一列且所在列中二者 ...

  8. java实现取球游戏

    /* 今盒子里有 n 个小球,A.B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个, 也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的 ...

  9. 2016蓝桥杯"取球博弈"问题

    较难,网上有能得出正确结果的代码,但是读了一下,像是拼凑出的结果,逻辑不通,代码和注释不符 参考网上代码写了一版,结构相对清晰,注释比较详细 题目很长: 两个人玩取球的游戏.一共有N个球,每人轮流取球 ...

随机推荐

  1. 独立看门狗实验-IWDG

    为什么要看门狗? 注意:喂狗是0XAAAA写到KR. 头文件iwdg.h iwdg.c

  2. C# Winform 跨线程更新UI控件常用方法总结(转)

    出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...

  3. Spring框架总结(五)

    自动装配(了解) 根据名称自动装配:autowire="byName" 自动去IOC容器中找与属性名同名的引用的对象,并自动注入 延续使用user.dao.service.acti ...

  4. Maven及POM文件

    Maven Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Logback是由LOG4创始人设计的又一个开源日志组件. 相关链接: Ma ...

  5. mybatis 配置延迟加载 和 缓存

    <!-- MyBatis延迟加载时,创建代理类 --> <dependency> <groupId>cglib</groupId> <artifa ...

  6. form action 相对路径出问题

    http://www.w3chtml.com/html5/tag/base.html <base> 标签为页面上的所有链接规定默认地址或默认目标. 通常情况下,浏览器会从当前文档的 URL ...

  7. Alpha冲刺(八)

    Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 进一步优化代码,结合自己负责的部分修 ...

  8. [示例] 使用 TStopwatch 计时

    使用 TStopwatch 计时 uses System.Diagnostics; var t1: TStopwatch; begin t1 := TStopwatch.StartNew; // do ...

  9. Ubuntu 安装 Memcached

    直接使用命令 sudo apt-get install Memcached 进行安装 安装完, 默认只能本地连接,需要修改一下配制文件,打开 /etc/Memcached.conf 文件, 找到一个 ...

  10. C#串口数据互通小程序

    主要功能: 所编写的程序需将串口1.串口2数据互通,即:串口1接收到数据的同时将数据通过串口2发出,串口2接收到数据的同时将数据通过串口1发出. 并根据需要由指定串口发送或获取数据. 代码如下: us ...