【求助】「luogu3706」[SDOI2017]硬币游戏

给题解跪辣!

这做法太神了。。

看到Accepted之前我一直不信这程序能AC。

因为方程系数的数量级是从10-1到10-91的!

用double储存跑高斯消元精度还不会爆炸!!

谁能告诉我是为什么

 1 #include<bits/stdc++.h>
 2 #define db double
 3 using namespace std;
 4 const int N=310,M=90010;
 5 const db eps=1e-10;
 6 int n,m;
 7 int ch[M][2],fail[M],v[M],dis[M],tot,pos[N];
 8 db a[N][N],p2[N];
 9 char s[N];
10 vector<int>bel[M];
11 void insert(char* str,int id){
12     int now=0;
13     for(int i=0;i<m;i++){
14         bel[now].push_back(id);
15         bool b=str[i]==‘H‘;
16         if(!ch[now][b]) ch[now][b]=++tot,dis[tot]=dis[now]+1;
17         now=ch[now][b];
18     }
19     v[now]=id,pos[id]=now;
20     return;
21 }
22 void build_ac(){
23     queue<int>q;
24     for(int i=0;i<=1;i++) if(ch[0][i]) q.push(ch[0][i]);
25     int x,nxt;
26     while(!q.empty()){
27         x=q.front();q.pop();
28         for(int i=0;i<=1;i++)if(ch[x][i]){
29             q.push(ch[x][i]);
30             nxt=fail[x];
31             while(nxt&&!ch[nxt][i]) nxt=fail[nxt];
32             fail[ch[x][i]]=ch[nxt][i];
33         }
34     }
35     return;
36 }
37 void gauss(){
38     for(int i=1;i<=n;i++){
39         int nxt=i;
40         for(int j=i+1;j<=n;j++)
41             if(fabs(a[j][i])>fabs(a[nxt][i])) nxt=j;
42         if(nxt!=i) for(int j=i;j<=n+1;j++) swap(a[i][j],a[nxt][j]);
43         for(int j=i+1;j<=n;j++){
44             db f=a[j][i]/a[i][i];
45             for(int k=i;k<=n+1;k++) a[j][k]-=a[i][k]*f;
46         }
47     }
48     for(int i=n;i>=1;i--){
49         a[i][n+1]/=a[i][i];
50         for(int j=i-1;j>=1;j--) a[j][n+1]-=a[j][i]*a[i][n+1];
51     }
52     return;
53 }
54 int main(){
55     scanf("%d%d",&n,&m);
56     p2[0]=1;
57     for(int i=1;i<=m;i++) p2[i]=p2[i-1]/2;
58     for(int i=1;i<=n;i++) a[i][n+1]=-p2[m];
59     for(int i=1;i<=n;i++){scanf("%s",s);insert(s,i);}
60     build_ac();
61     for(int i=1;i<=n;i++){
62         a[i][i]=1;
63         int now=fail[pos[i]];
64         while(now){
65             for(int j=0;j<bel[now].size();j++){
66                 int pre=bel[now][j];
67                 a[pre][i]+=p2[m-dis[now]];
68             }
69             now=fail[now];
70         }
71     }
72     for(int i=1;i<=n;i++) a[n+1][i]=1;
73     a[n+1][n+2]=1;
74     n++;
75     gauss();
76     for(int i=1;i<n;i++) printf("%.10lf\n",a[i][n+1]);
77     return 0;
78 }

原文地址:https://www.cnblogs.com/mycups/p/8586498.html

时间: 2024-10-11 22:15:07

【求助】「luogu3706」[SDOI2017]硬币游戏的相关文章

【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元

[BZOJ4820][Sdoi2017]硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找一个同学扔很多很多次硬币,其他同学记录下正反面情况.用H表示正面朝上,用T表示反面朝上,扔很多次硬币后,会得到一个硬币序列.比如HTT表示第一次正面朝上,后两次反面朝上.但扔到什么时候停止呢?大家提议,选出n个同学,每个同学猜一个长度为m的序列,当某

Bzoj4820 [Sdoi2017]硬币游戏

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 212  Solved: 87 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符 合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找一个同学扔很多很多次硬币 ,其他同学记录下正反面情况.用H表示正面朝上,用T表示反面朝上,扔很多次硬币后,会得到一个硬币序列.比 如HTT表示第一次正面朝上,后两次反面朝

SDOI2017硬币游戏

题面链接 洛咕 sol 神题,幸好我不是SD的QAQ. 假设你们都会\(O(n^3m^3)\)的高斯消元,具体来说就是建出\(Trie\)图然后套游走的板子. 然后我们发现可以把不能匹配任何串的概率压到一起. 考虑一个不能匹配任何串的\(S\).一个串\(A_i\)获胜当且仅当最后串是这样的:\(S+A_i\). 真的吗? 如果\(S\)的后缀和\(A_i\)的前缀能拼出来\(A_j\)就假掉了.所以神仙们采用了神仙做法. 引用\(Kelin\)神犇的例子. 举个例子设\(A=101,B=110

[SDOI2017]硬币游戏

考虑令\(p_i\)表示第\(i\)个人赢的概率,那么显然我们可以得到. \[ p_i+\sum_{j=1}^np_j(\sum_{k=1}^{m-[i==j]}[prefix(i,k)=suffix(j,k)]\frac{1}{2^{m-k}}) = \frac{1}{2^m} \] 然后高斯消元即可. /* mail: [email protected] author: MLEAutoMaton This Code is made by MLEAutoMaton */ #include<st

loj2004. 「SDOI2017」硬币游戏

2004. 「SDOI2017」硬币游戏 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多很多次硬币,其他同学记录下正反面情况. 用 $ \texttt{H} $ 表示正面朝上, 用 $ \texttt{T} $ 表示反面朝上,扔很多次硬币后,会得到一个硬币序列.比如 $ \texttt{HTT} $ 表示第一次正面朝上,后两次反面朝上. 但扔到什么时

开放的智力8:实用「成功学」

可实现的「成功学」 现在我想为这里的年轻人介绍一种可实现的「成功学」.希望这个我自创的理论,可以改变很多人的一生. 当我们评价一个事情值不值得去做.应该花多少精力去做的时候,应该抛弃单一的视角,而是分两个不同的维度来看,一是该事件将给我带来的收益大小(认知.情感.物质.身体方面的收益皆可计入),即「收益值」:二是该收益随时间衰减的速度,我称为「收益半衰期」,半衰期长的事件,对我们的影响会持续得较久较长. 这两个维度正交以后就形成了一个四象限图.我们生活.学习和工作中的所有事情都可以放进这个图里面

程序员「奇葩」说

一直以来「奇葩」这个词都是偏贬义的,直到去年有个综艺节目叫「奇葩说」挺热闹,这里的人不一定是奇葩,更多指达人的意思. 「奇葩说」里的达人都是能说会道的,我的主业是程序员,所以只能写写在我职业生涯中碰到的一些「奇葩」程序员. 你懂的,我这里的「奇葩」没有任何贬义的意思. 月在胸襟人在途 我刚入行时的第一位项目经理,70后.那年三十出头,在银行客户现场做项目经理,负责一个二十来人的客户现场团队. 虽然他的职位是项目经理,但实际那时他真是一名地道的资深程序员. 70 后的程序员大都是从写 C 开始的,

零元学Expression Blend 4 - Chapter 17 用实例了解互动控制项「CheckBox」I

原文:零元学Expression Blend 4 - Chapter 17 用实例了解互动控制项「CheckBox」I 本章将教大家如何运用CheckBox做实作上的变化:教你如何把CheckBox变藏宝箱! ? 本章将教大家如何运用CheckBox做实作上的变化:看我怎麽把CheckBox变藏宝箱! ? 最近帮公司做了一个互动式的小游戏,运用了CheckBox的功能,就顺便介绍给大家 为了利益回避,以及日後不必要的麻烦,本章范例已经简化了很多东西,只留下与相关的图片及功能 ? 01 先简单介绍

零元学Expression Blend 4 - Chapter 12 用实例了解布局容器系列-「Viewbox」

原文:零元学Expression Blend 4 - Chapter 12 用实例了解布局容器系列-「Viewbox」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend 4 里的-「Viewbox」: 以及加码赠送安装扩充元件-「Silverlight Toolkit」. ? 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器是Blend 4 里的-「Viewbox」: 以及加码赠送安装扩充元件-「Silverlight Toolki