传送门


讲个笑话,把这道题A了才能算 “Surreal Number在不平等博弈中的应用” 入门

理解不能

题解:

不要以为双方棋子属性相同就不是不平等博弈了。。。

不平等博弈指的是在一个局面下轮到 L L L走, L L L能够进行的合法操作和轮到 R R R走, R R R能够进行的合法操作不同。

注意到这个是无环的而且有多个局面,而且还TM要计数,考虑用Surreal Number来描述这个游戏。

由于题目说了只有 23 23 23种情况,我们考虑大力把这些情况和当前这些局面的游戏值手玩出来。

直接从初始状态开始向下dfs即可手玩所有状态。

然而当你玩到LRL_R的时候,如果你不平等博弈只看过09年集训队论文,你就傻了。

这个状态的 L L L决策为LR_LR, R R R决策为LRLR_,左右两个都是 0 0 0,也就意味着当前状态的Surreal Number表示为 { 0 ∣ 0 } \{0|0\} {0∣0},09年集训队论文会告诉你这不是一个合法的Surreal Number。

不合法怎么办,弃了,还做个屁啊,这题肯定有锅,考虑引入新记号。

设特殊记号 ∗ = { 0 ∣ 0 } , ↑ = { 0 ∣ ∗ } , ↓ = { ∗ ∣ 0 } *=\{0|0\},\uparrow=\{0|*\},\downarrow=\{*|0\} ∗={0∣0},↑={0∣∗},↓={∗∣0}为Surreal Number,并且它们不能用任何一个实数表示。

接下来的分析已经有点脱离了一般的Surreal Number理论了。

如果你只想感性理解的话,我感觉没门

容易发现 ∗ * ∗是一个先手必胜态,但是注意,不是所有先手必胜态都可以表示为* 。

同时根据Surreal Number中相反数的定义, ∗ = − ∗ *=-* ∗=−∗,也就是说 ∗ + ∗ = ∗ − ∗ = 0 *+*=*-*=0 ∗+∗=∗−∗=0,可以自己验一下,在Surreal Number加法意义下这个也是成立的。同时根据实际意义可以发现 { ∗ ∣ ∗ } = 0 \{*|*\}=0 {∗∣∗}=0。

{ ∗ ∣ ∗ } = 0 , { 0 ∣ 0 } = ∗ \{*|*\}=0,\{0|0\}=* {∗∣∗}=0,{0∣0}=∗,这个看上去就很妙(虽然说这道题并不用)。

考虑一下 ↑ , ↓ \uparrow,\downarrow ↑,↓的实际含义。

考虑 ↑ = { 0 ∣ ∗ } \uparrow=\{0|*\} ↑={0∣∗},如果此时该 L L L行动, L L L在执行过后会走到一个后手必胜的 0 0 0局面,此时的后手就是 L L L,如果 R R R执行了操作,就会走到一个先手必胜的 ∗ * ∗局面,此时先手还是 L L L。

我们发现单独一个 ↑ \uparrow ↑局面是 L L L必胜,单独一个 ↓ \downarrow ↓局面是 R R R必胜,现在问题在于我们要求和啊,只知道单独局面的结果是无法求和的,我们需要一个游戏值,一个衡量赢面有多大的东西。

前面已经说了这个东西并不能用实数衡量,也就是说不能求和,而我们实际要考虑的其实就是求和结果和 0 0 0局面的大小关系。

求和考虑后继局面,于是我们发现更加扯淡的是我们需要支持一个实数和 ∗ * ∗局面求和。。。

还有什么办法,硬推呗


待更新。。。。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constvoid file(){#ifdef zxyoifreopen("frog.in","r",stdin);
#endifstd::ios::sync_with_stdio(false);
}using std::cin;
using std::cerr;
using std::cout;cs int mod=998244353;
inline int add(int a,int b){return a+b>mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline int po(int a,int b){int r=1;for(;b;b>>=1,a=mul(a,a))if(b&1)r=mul(r,a);return r;
}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}cs int N=1e6+7;
int fac[N],ifc[N];
void init_fac(){fac[0]=1;for(int re i=1;i<N;++i)fac[i]=mul(fac[i-1],i);ifc[N-1]=po(fac[N-1],mod-2);for(int re i=N-1;i;--i)ifc[i-1]=mul(ifc[i],i);
}
inline int C(int n,int m){return mul(fac[n],mul(ifc[m],ifc[n-m]));
}void init_C(int n,int *a){for(int re i=0;i<=n;++i)a[i]=C(n,i);
}
int a[N],b[N],c[N];
// 0   1  2  3  4  5  6  7
//-1 -1/2 0 1/2 1  * up dn
int ct[11];
//<0, =0 ,>0
int num[15],ans[15],cnt[15];
int sign(int x){switch(x){case 1:return 3;case 0:return 2;case -1:return 1;default:return x<0?0:4;}
}
void solve(){int n,m=0;cin>>n;memset(ct,0,sizeof ct);memset(num,0,sizeof num);memset(ans,0,sizeof ans);memset(cnt,0,sizeof cnt);while(n--){std::string s;int x;cin>>s>>x;m+=x;if(s=="LL_RR")ct[5]+=x;if(s=="L_LRR")ct[6]+=x;if(s=="_LLRR")ct[2]+=x;if(s=="LRL_R")ct[5]+=x;if(s=="LR_LR")ct[2]+=x;if(s=="_RLLR")ct[0]+=x;if(s=="R_LLR")ct[2]+=x;if(s=="LRRL_")ct[4]+=x;if(s=="LRR_L")ct[2]+=x;if(s=="LRLR_")ct[2]+=x;if(s=="LR_RL")ct[1]+=x;if(s=="_RLRL")ct[0]+=x;if(s=="R_LRL")ct[2]+=x;if(s=="RRL_L")ct[4]+=x;if(s=="RR_LL")ct[2]+=x;if(s=="LLR_R")ct[7]+=x;if(s=="L_RLR")ct[5]+=x;if(s=="_LRLR")ct[2]+=x;if(s=="RL_LR")ct[3]+=x;if(s=="RLRL_")ct[4]+=x;if(s=="RLR_L")ct[2]+=x;if(s=="R_RLL")ct[0]+=x;if(s=="LLRR_")ct[2]+=x;}init_C(ct[0]+ct[4],a);//-1 ,1init_C(ct[1]+ct[3],b);//-1/2 ,1/2init_C(ct[7]+ct[6],c);//up ,dnfor(int re i=1;i<=ct[1]+ct[3];++i)Inc(b[i],b[i-1]);for(int re i=0,j=ct[1]+ct[3],k=j;i<=ct[0]+ct[4];++i){while(~j&&(i-ct[0])*2+(j-ct[1])>=0)--j;while(~k&&(i-ct[0])*2+(k-ct[1])>0)--k;if(~j)Inc(num[0],mul(a[i],b[j]));if(~k)Inc(num[1],mul(a[i],b[k]));}num[2]=po(2,ct[0]+ct[1]+ct[2]+ct[3]+ct[4]);Mul(num[0],po(2,ct[2]));Mul(num[1],po(2,ct[2]));Dec(num[2],num[1]);Dec(num[1],num[0]);    for(int re i=0;i<=ct[6]+ct[7];++i)Inc(cnt[sign(i-ct[7])],c[i]); ans[0]=mul(num[2],po(2,ct[5]+ct[6]+ct[7]));ans[1]=mul(num[0],po(2,ct[5]+ct[6]+ct[7]));if(ct[5]==0){Inc(ans[0],mul(num[1],cnt[3]+cnt[4]));Inc(ans[1],mul(num[1],cnt[0]+cnt[1]));Inc(ans[3],mul(num[1],cnt[2]));}else {int p=mul(po(2,ct[5]-1),num[1]);Inc(ans[0],mul(p,cnt[3]+cnt[4]));Inc(ans[1],mul(p,cnt[0]+cnt[1]));Inc(ans[3],mul(p,cnt[2]));Inc(ans[0],mul(p,cnt[4]));Inc(ans[1],mul(p,cnt[0]));Inc(ans[2],mul(p,add(cnt[1],add(cnt[2],cnt[3]))));}cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2]<<" "<<ans[3]<<"\n";
}signed main(){file();init_fac();int T,id;cin>>id>>T;while(T--)solve();return 0;}

【清华集训2017】福若格斯(不平等博弈)(Surreal Number)(生成函数)(二项式展开)相关推荐

  1. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  2. 清华集训2017题解

    ioi赛制好评QAQ 好像啥都记不得了就不写游记了 Day 1 1.1 生成树计数(tree.cpp) 1.1.1. 题意 ​ 有 n≤30000n≤30000 n \le 30000 个点,第 ii ...

  3. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  4. 清华集训2017刷题记录

    2322. 「清华集训 2017」Hello world! 题意 一棵树每个点有点权,每次可以选择两个点\(s, t\),选择步长为\(k\),从\(s\)跳到\(t\)(不足\(k\)步直接到\(t ...

  5. 【清华集训2017】榕树之心

    简要题意:(考虑到某些人搜题解只是懒得看题面) 特殊点从 \(1\) 号点出发,每次选择一个与当前选择连通块相连的点,加入连通块,并且把我们的特殊点向那个选的点移动一格.对每个点求是否能成为我们的特殊 ...

  6. [清华集训2017]无限之环(网络流)

    很妙的一道题 对于每个格子,它合法与否,只跟它上下左右的相邻格子有关,所以可以想到黑白染色 (用 (i,j) 表示 i 行 j 列的格子,我把 (i+j) %2 == 0 的格子染成白色,把(i+j) ...

  7. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  8. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  9. JZOJ 5489. 【清华集训2017模拟11.28】海明距离

    Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...

  10. JZOJ 5484. 【清华集训2017模拟11.26】快乐树

    Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...

最新文章

  1. java中的队列详解
  2. NeHe OpenGL教程 第三十六课:从渲染到纹理
  3. AAAI 2021 | 学习截断信息检索排序列表
  4. go 关闭通道的必要性
  5. mysql设置定位慢查询_mysql优化——定位慢查询
  6. 【Kafka】kafka 1.0.0 查询订阅某topic的所有consumer group
  7. java - What is a fat JAR? - Stack Overflow
  8. 一个iOS开发者的Flutter“历险记”
  9. totalspider爬虫批量重启报错Connection Error
  10. 【文末福利】聊天机器人的几种主要架构实现
  11. 计算机网络系统承接查验,智能化系统承接查验.doc
  12. PPT处理控件Aspose.Slides功能演示:使用 Java 在 PowerPoint 中创建和操作表格
  13. IK和pinyin分词器
  14. http请求 405错误
  15. Python 编码错误的本质原因
  16. 【WEB前端优化】面试必备
  17. 工业镜头与普通镜头有什么区别?
  18. 离散数学1-数理逻辑的基本概念
  19. jks证书转为pem证书,TrustedCertEntry not supported的解决办法
  20. 设计模式 — 抽象工厂模式

热门文章

  1. SwiftUI Xcode 大全之在Xcode 13中添加 Swift 包依赖项 Swift Packages
  2. [政策活动] 智能制造能力成熟度模型及评估方法
  3. 数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词
  4. 手机游戏影响游戏主机发展的5个方面
  5. 有1000个一模一样的瓶子,其中有999瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出那个瓶子里有毒药?
  6. sql学习之单行函数
  7. 工作记录--我在路上
  8. 我们在囧途之软件需求篇
  9. 深圳无人驾驶公交车试运行,刷爆朋友圈!
  10. 万网服务器虚拟机php.ini设置