[SDOI2017]硬币游戏

考虑生成函数来做

g(x)函数就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n
就是最后s位必须填这个串,但是前面随便填的方案数
然后枚举之前出现了哪个串(包括自己),如果没有相交,就是fj(x)*g(x),还有就是有前后缀有相交部分,
Pji(x)中的第k位,表示i的长度为m-k的前缀和j的长度为m-k的后缀是不是一样 0/1。
再加上最后一个
$\sum f_i=1$因为游戏最终会停止
现在有n+1个方程,g(x)直接当做未知数的话会有交叉项解不出来
把$(1-|\Sigma|x)$乘过去,求导来搞搞事情:
由于带入$x=1/|\Sigma|$使得这个$(1-|\Sigma|x)$等于0,求导可以消去一些项
$-|\Sigma|fi=S(x)^{S-1}-Sx^{S-1}(\sum_jf_j)-x^S(\sum_jf'_j)+|\Sigma|(\sum_jf_jP_{ji})$
把$(\sum_jf'_j)$当做另外一个未知量
就有n+1个未知量,n+1个方程了
根据“洛必达法则”(一种极限处理)由于最后是收敛的,一定有极限,所以带入当x=1/|∑|的时候不会除以0成为很大的数(我在口胡)
代码:
卡精度,不用eps反而更好
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define ld long double
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=;
const double eps=1e-;
const ll mod[]={,};
const ll jin[]={,};
ll pw[N][];
ll has[N][N][];
char s[N];
ld f[N][N];
ld ans[N];
int n,m;
ld m0,m1;
bool cmp(ld x){
return ;
}
void Guass(int n){
for(reg i=;i<=n;++i){
int id=;
for(reg j=i;j<=n;++j){
if(cmp(f[j][i])&&fabs(f[j][i])>fabs(f[id][i])) id=j;
}
if(id!=i){
for(reg j=;j<=n+;++j){
swap(f[i][j],f[id][j]);
}
}
for(reg j=i+;j<=n;++j){
if(cmp(f[j][i])){
ld tmp=f[j][i]/f[i][i];
for(reg k=;k<=n+;++k){
f[j][k]=f[j][k]-f[i][k]*tmp;
}
}
}
}
for(reg i=n;i>=;--i){
for(reg j=;j<=n;++j){
if(cmp(ans[j])) f[i][n+]-=ans[j]*f[i][j];
}
ans[i]=f[i][n+]/f[i][i];
}
}
int main(){
rd(n);rd(m);
pw[][]=pw[][]=;
for(reg i=;i<=m;++i){
for(reg j=;j<=;++j){
pw[i][j]=pw[i-][j]*jin[j]%mod[j];
}
}
for(reg i=;i<=n;++i){
scanf("%s",s+); for(reg j=;j<=m;++j){
for(reg l=;l<=;++l){
has[i][j][l]=(has[i][j-][l]*jin[l]+s[j]-'A')%mod[l];
}
}
}
m0=m1=1.0;
for(reg i=;i<=m;++i) m1=m1*0.5;
m0=m1*; for(reg i=;i<=n;++i){
// cout<<" turns "<<i<<" ----------------------- "<<endl;
for(reg j=;j<=n;++j){ // cout<<" with "<<j<<endl;
ld tmp=0.5;
ld val=;
for(reg k=;k<=m-;++k){
int to=m-k;
ll bac0=(has[j][m][]-has[j][m-to][]*pw[to][]%mod[]+mod[])%mod[];
ll bac1=(has[j][m][]-has[j][m-to][]*pw[to][]%mod[]+mod[])%mod[]; if(bac0==has[i][to][]&&bac1==has[i][to][]){
// cout<<" ok "<<to<<endl;
val+=tmp;
}
tmp*=0.5;
}
// cout<<" val "<<val<<endl;
f[i][j]=m*m0-2.0*val;
}
f[i][i]-=2.0;
f[i][n+]=m1;
f[i][n+]=m*m0;
} for(reg i=;i<=n;++i){
f[n+][i]=1.0;
}
f[n+][n+]=1.0; // for(reg i=1;i<=n+1;++i){
// for(reg j=1;j<=n+2;++j){
// cout<<f[i][j]<<" ";
// }cout<<endl;
// }
Guass(n+); for(reg i=;i<=n;++i){
printf("%.10Lf\n",ans[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/18 17:41:21
*/
总结:
对于连续一些位置有值的时候,
生成函数确实很好用
求导由于可以降次,这里就把交叉项成功分开了。
PS:这个题也有直接上概率的做法,本质和生成函数相同。但是解释起来最好的绝对是生成函数
[SDOI2017]硬币游戏的更多相关文章
- <题解>[SDOI2017]硬币游戏
solutions 题面(loj) 题面(luogu) 这个题吧是我很久很久以前留下的坑了,到了今天才补好.(是不是太菜了) 暴力 这个和之前的题解一样,确实可以用 trie 树,这复杂度是\(\ma ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元
[BZOJ4820][Sdoi2017]硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬 ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- 4820: [Sdoi2017]硬币游戏
4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...
- BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*
BZOJ4820 Sdoi2017 硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实 ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- luogu3706 [SDOI2017]硬币游戏
LINK:硬币游戏 对于40分的暴力 构造出AC自动机 列出转移矩阵 暴力高消.右转上一篇文章. 对于100分 我们不难想到这个矩阵过大 且没有用的节点很多我们最后只要n个节点的答案 其他节点的答案可 ...
- [bzoj4820][Sdoi2017]硬币游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了 ...
随机推荐
- 20155218《网络对抗》Exp8 Web基础
20155218<网络对抗>Exp8 Web基础 1.基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等) ...
- 20155305《网络对抗》MSF基础应用
20155305<网络对抗>MSF基础应用 实验过程 实验系统 靶机1:Windows XP Professional SP2 ,IP地址:192.168.1.108 靶机2:Window ...
- 20155321 《网络攻防》 Exp9 Web安全基础
20155321 <网络攻防> Exp9 Web安全基础 基础问题 SQL注入攻击原理,如何防御 原理:在事先定义好的SQL语句的结尾上添加额外的SQL语句(感觉一般是或上一个永真式),以 ...
- Invitation Cards POJ-1511 (spfa)
题目链接:Invitation Cards 题意: 给出一张有向图,现在要求从1到其他所有的结点的最小路径和与从所有其他结点到1的最小路径和之和. 题解: 求最小路径可以用SPFA来求解.从1到其他结 ...
- [CF1060E]Sergey and Subway[树dp]
题意 给出 \(n\) 个点的树,求 \(\sum_{i=1}^n{\sum_{j=i}^n{\lceil \frac{dis(i,j)}{2} \rceil}}\) . \(n\leq 2 \tim ...
- WebService技术,服务端发布到Tomcat(使用Servlet发布),客户端使用axis2实现(二)
还是在WebService技术,服务端and客户端JDK-wsimport工具(一)的基础上实现.新建一个包:com.aixs2client.目录结构如下: 一.服务端: 1.还是使用com.webs ...
- 接口自动化测试框架-AIM
最近在做公司项目的自动化接口测试,在现有几个小框架的基础上,反复研究和实践,搭建了新的测试框架.利用业余时间,把框架总结了下来. AIM框架介绍 AIM,是Automatic Interface Mo ...
- 【文章存档】如何通过 GitLab 进行持续部署
好久没写博客了,这几天存档一下新文章. 链接 https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/a ...
- React Native 'config.h' file not found 问题、 'glog/logging.h' file not found 问题、configure: error: C compiler cannot create executables问题解决过程记录
1.在github 上面 git clone 一个RN 项目代码,npm install (yarn)后,准备运行iOS工程,发现'config.h' file not found ,恶心!!! 百度 ...
- 2-Thirteenth Scrum Meeting-10151213
任务安排 成员 今日完成 明日任务 闫昊 获取视频播放进度 用本地数据库记录课程结构和学习进度 唐彬 阅读IOS代码+阅读上届网络核心代码 请假(编译……) 史烨轩 下载service开发 ...