首页 > 其他分享 >[SDOI2017] 硬币游戏

[SDOI2017] 硬币游戏

时间:2024-04-10 19:00:25浏览次数:27  
标签:frac 游戏 硬币 int 可以 合法 SDOI2017 序列

[SDOI2017] 硬币游戏

还是因为感觉网上的写的不够清晰,所以来写一篇

用\(P(i)\)表示第\(i\)个同学胜利的概率,\(s_i\)表示第\(i\)个同学猜的序列

可以发现,第\(i\)个同学胜利当且仅当当前硬币序列\(T\)的后\(m\)位刚好为\(s_i\),且\(T\)除了最后\(m\)位出现过\(s_i\),其他任何位置都没有出现过任何一个同学猜的序列

那么这样的\(T\)一定可以表示为\(S+s_i\),其中\(S\)是一个不合法的硬币序列

但可以发现,不一定所有的\(S+s_i\)都是合法的\(T\),因为可能出现\(S\)的后\(k\)个和\(s_i\)的前\(m-i\)个刚好构成了某一个\(s_j\)

不过好在,这种情况不算复杂,这样的\(S+s_i\)其实就相当于是\(S'+s_j+s'_i\),其中\(S'\)为\(S\)去掉后\(k\)个字符后的序列,\(s'_i\)为\(s_i\)去掉了前\(m-i\)个字符后的序列

那么显然可以发现,若\(k\)取最大,\(S'+s_j\) 一定是一个合法的\(T\)

eg:

\(\{s\}\)为\(abc,bcd,cda\)

当前序列为\(Q+a+b+s_3\),其中\(S=Q+a+b\)

那么\(k\)不用取最大时,可取\(1\)或\(2\),此时显然当\(k\)取\(1\)时的\(S'\)为\(Q+a\),\(k\)取\(2\)时的\(S'\)为\(Q\)

可以发现\(k\)取\(1\)时的\(S'+s_2\)不是一个合法的\(T\),因为里面还包含了\(s_1\),而\(k\)取\(2\)时显然是合法的

而当\(k\)取最大时,可以发现对于同一个\(i\),每种不合法的\(T\)都和某个\(j\)一一对应,也就是说,当前不合法的\(T\)是由一个\(j\)的某一个合法的\(T\)加上\(i\)的某一个后缀,使得最后\(m\)个字符恰好等于\(s_i\)

这样就可以做到不重不漏的得到所有\(i\)对应的所有不合法的\(T\)

设\(X\)为得到合法或不合法的\(T\)的概率和,则\(\frac{X}{2^{m}}\)为得到某个特定的\(s_i\)的\(T\)的概率

则有转移:

\[\forall i,\frac{X}{2^{m}}=p(i)+\sum_{j=1\&\&j\neq i}^{n}\sum_{k=1}^m[pre_{i,k}==suf_{j,k}]\frac 1{2^{m-k}}p(j) \]

这里的\(\frac1{2^{m-k}}\)是因为得到的\(S+s_i\)是\(S'+s_j\)后再加上\(m-k\)个指定的字符

因为我们的未知数有\(X\),\(p(i)\)共\(n+1\)个,所以还需再加上一个\(\sum p(i)=1\)就可以解出所有未知数了

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=305,P=131;
const double eps=1e-6;
int n,m;
char s[N][N];
ull pre[N][N],suf[N][N],pw[N];
double a[N][N],pw2[N];
int cmp(double x){ return fabs(x)<eps?0:x<0?-1:1; }
void guass(int n){
    for(int i=1,p;i<=n;++i){
        p=i;
        for(int j=i+1;j<=n;++j) if(cmp(a[j][i]-a[p][i])>0) p=j;
        if(i^p) swap(a[i],a[p]);
        for(int j=1;j<=n;++j) if(i^j){
            double v=-a[j][i]/a[i][i];
            for(int k=1;k<=n+1;++k) a[j][k]+=v*a[i][k];
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    pw[0]=1; for(int i=1;i<=m;++i) pw[i]=pw[i-1]*P;
    for(int i=1;i<=n;++i){
        scanf("%s",s[i]+1);
        for(int j=1;j<=m;++j) pre[i][j]=pre[i][j-1]*P+s[i][j];
        for(int j=m;j;--j) suf[i][j]=suf[i][j+1]+s[i][j]*pw[m-j];
    }
    pw2[0]=1; for(int i=1;i<=m;++i) pw2[i]=pw2[i-1]/2.;
    for(int i=1;i<=n;++i){
        a[i][n+1]=-pw2[m];
        for(int j=1;j<=n;++j)
            for(int k=1;k<=m;++k)
                if(pre[i][k]==suf[j][m-k+1]) a[i][j]+=pw2[m-k];
    }
    for(int i=1;i<=n;++i) a[n+1][i]=1;
    a[n+1][n+2]=1;
    guass(n+1);
    for(int i=1;i<=n;++i) printf("%.6lf\n",a[i][n+2]/a[i][i]);
    return 0;
}

因为我们并不关心\(X\)的具体值,且所有\(a[i][n+1](i\in[1,n])\)是相同的,则在高斯消元时,\(X\)的系数不会影响\(p(i)\)的取值,所以可以在第\(32\)行的\(a[i][n+1]=-pw2[m]\)赋值处直接附任意一个值,只需要保证对于任意一个\(a[i][n+1](i\in[1,n])\)都是相同的值即可

或者说可以这样理解:我们假如已经求出了真正的\(X\)值,那么这时我们将方程中所有\(X\)的系数乘上同一个值\(k\),则为了保持原式依旧成立,\(X\)的值要乘上\(\frac 1k\),因为\(n+1\)个式子就可以唯一确定\(n+1\)元一次多项式,那么新的高斯消元求出来的就是这个新的\(X\),明显其的系数对\(p(i)\)没有任何影响

标签:frac,游戏,硬币,int,可以,合法,SDOI2017,序列
From: https://www.cnblogs.com/LuoyuSitfitw/p/18127176

相关文章

  • vue做游戏vue游戏引擎vue小游戏开发
    Vue.js是一个构建用户界面的渐进式JavaScript框架,它同样可以用于游戏开发。使用Vue开发游戏通常涉及以下几个关键步骤和概念:1.了解Vue的核心概念 1在开始使用Vue进行游戏开发之前,你需要理解Vue的一些核心概念,如组件化、响应式数据绑定、指令、生命周期钩子等。这......
  • 基于Golang的Nano游戏服务器框架
    在游戏开发过程中,一个高效的服务器框架是至关重要的。Nano正是这样一个框架,它以Golang为基础,提供了轻量级、高性能的服务器解决方案。下面,我们将深入探讨Nano的设计理念、核心特性以及如何在实战中使用它。Nano框架概述Nano是一个针对游戏服务器的框架,能够帮助开发者快速......
  • 使用微信小程序开发制作一个简单的微信小游戏
    微信小程序是一种基于微信平台的应用程序开发框架,开发者可以使用微信小程序开发工具进行开发,开发出来的小程序可以在微信中直接使用。微信小游戏是微信小程序的一种特殊类型,主要面向用户提供小型、简单的游戏体验。下面我将为您详细介绍如何使用微信小程序开发工具制作一个简单......
  • 【猜数字游戏】-C语言循环的应用及扩展函数的使用
    一、扩展函数的应用1.rand()生成随机数rand()函数需要引用一个头文件:#include<stdlib.h>intrand(void)//int代表返回一个整数,void代表无参数rand()无参数,会返回一个伪随机数,范围是0-RAND_MAX,这个RAND_MAX的大小依赖于编译器,大部分编译器上是32767rand()函数用法展......
  • threejs——开发一款塔防游戏
    前言完成效果gif图较大,耐心等待,源码见文末为了上班摸鱼合理的玩游戏,我写了一个3d塔防游戏,其中功能包含动画、敌人运动、放置武器、升级武器、销毁武器、动态检测等功能。请动动小手,点赞收藏,这就发车~目录结构思维导图具体功能和思路如下有了这个思维导图,就可以......
  • 2849: 【广度优先】【优先队列】游戏装备
     题目描述小未在玩一款武侠游戏,游戏里PK不仅要有高超的操作和智慧,还要有很牛的装备。现在他进入了一个副本,副本里面有极品15星的装备宝箱,但是从副本入口到宝箱有很多条路,当然不可能轻轻松松的拿到极品装备。一路上会随机刷出各种攻击力很强的怪物。它会攻击小未的角色,当然也......
  • 幻兽帕鲁游戏服务器价格揭秘:2024年主机活动优惠汇总,让你轻松入手!
    对于热爱《幻兽帕鲁》这款游戏的玩家来说,与好友联机畅玩无疑是增加游戏乐趣的绝佳方式。但想要实现稳定、流畅的多人联机体验,一个高性能的游戏服务器是必不可少的。那么,开通一个幻兽帕鲁游戏服务器需要多少钱呢?接下来,就让我们一起了解一下腾讯云和阿里云提供的幻兽帕鲁游戏服务......
  • 搭建幻兽帕鲁/Palworld游戏服务器费用全攻略:2024年价格表助你轻松选择
    对于热爱幻兽帕鲁的玩家们来说,拥有一个属于自己的游戏服务器无疑是极致体验。但很多玩家可能对于部署服务器的价格和流程感到迷茫。今天,就为大家揭秘这一神秘的面纱。首先,我们来看看阿里云上的幻兽帕鲁Palworld游戏服务器价格。根据不同的配置,价格也有所差异。4核16G10M的服务......
  • 【VipSkill 打造游戏全领域“产学研“生态体系】
    VipSkill打造游戏全领域"产学研"生态体系VipSkill(上海育界数码科技有限公司),是一家垂直于游戏领域,致力于构建游戏行业一站式"产学研"平台的互联网公司,专注于游戏行业职业教育。自成立以来,VipSkill一直致力于成为游戏行业的"黄埔军校",通过高质量的教育服务,培养出能......
  • 英伟达计划上调游戏显卡的售价,预计涨幅约为10%。
        受供应减少和市场需求增加的影响,英伟达在中国大陆的游戏显卡价格普遍上涨,其中RTX4060Ti及以下级别产品的涨幅达到了10%。    具体来说,调价幅度如下:RTX4070SUPER系列上调100元,RTX4060Ti/4060系列上调20至50元,RTX3050系列上调50元,GTX1650系列上调30元......