Description

  
​   现在 Yopilla 和 yww 要开始玩游戏!
  
  ​ 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) 。然后在每个点上放置一些棋子,其中第 \(i\) 个点放置了 \(a_i\) 个棋子。接下来,从 Yopilla 开始操作,双方轮流操作,谁不能操作谁输。每次的操作是:当前操作方选定一个有棋子的点 \(x\) ,然后选择至少一个点 \(x\) 上的棋子,然后把这些棋子全都移动到点 \(x / prime\) 上,其中 \(prime\) 是一个质数,且 \(prime \mid x\)
  
  ​ Yopilla 最初一次操作的策略是随机的:随机找到一个有棋子的点 \(x\) ,随机选择正整数个棋子 \(y\) ,随机转移到一个能转移到的点 \(z\) 。所有棋子可以看作是一样的,换句话说:两种操作不同,当且仅当三元组 \((x, y, z)\) 不同。之后双方都按照最优策略来操作。
  
​   Yopilla 想要预测,他能够获胜的概率是多少,答案对 \(998244353\) 取模。
  
​  
  
  
  

Solution

  
​   我们发现,对于每一个数,如果以其幂指数之和为下标来将它们重新排列成一个数组,这个问题就变成了阶梯\(Nim\)问题。一次操作,相当于将一个数移动到其左边。不能移动者输。
  
​   事实上我们不需要实现这个重排操作。我们只需要知道每个数重排后是否在奇位置即可。
  
​   记输入数列为\(a\),我们统计出所有处于奇位置的数\(x\)的\(a_x\)的异或和\(sum\)。
  
​   我们要统计Yopilla一开始的随机操作一共有多少种可能、以及总共有多少种可能,使得操作后局面的先手必败。前者很好计算,就是\(\sum_x a_x*b_x\),其中\(b_x\)表示\(x\)这个数的不同质因子个数。
  
​   后者如何计算呢?对操作分类:(1)移动奇位置的数至偶位置、(2)移动偶位置的数至奇位置。
  
​   我们枚举所有奇位置的数。假设对该位置\(i\)操作后,总异或和\(sum\)等于0,即操作后先手必败,则\(a_i\)应该由\(a_i\)变成\(target=sum\; \text{xor}\; a_i\),
  
  如果原值比目标值大,那么显然(1)容易满足,选出\(a_i-target\)个数,并将它们通过任意一个质因子移动到偶位置,一共有\(b_i\)种合法情况。
  
  如果原值与目标值相等,则什么也做不了,一改就不满足要求,不作为合法情况考虑。
  
  若原值小于目标值,则考虑(2),枚举所有能转移到\(i\)的偶位置\(j=i*p\)(其中\(p\)是枚举的质数),如果\(a_j \ge target-a_i\),那么合法情况就多了一种,因为\(j\)可以选\(target-a_i\)个数通过唯一一种方式——除去\(p\)——来到达\(i\)。
  
​   那么概率也就很好计算了。
  
  
  

Code

  

#include <cstdio>
using namespace std;
const int N=1000005,MOD=998244353;
int n,a[N];
bool vis[N];
int p[N],pcnt,b[N],c[N];
void sieve(){int up=1e6;for(int i=2;i<=up;i++){if(!vis[i]){p[++pcnt]=i;b[i]=c[i]=1;}for(int j=1;j<=pcnt&&i*p[j]<=up;j++){int x=i*p[j];vis[x]=true;c[x]=c[i]^1;if(i%p[j]==0){b[x]=b[i];break;}b[x]=b[i]+1;}}
}
void readData(){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",a+i);
}
inline int fmi(int x,int y){int res=1;for(;y;x=1LL*x*x%MOD,y>>=1)if(y&1) res=1LL*res*x%MOD;return res;
}
void solve(){int x=0;for(int i=1;i<=n;i++) if(c[i]) x^=a[i];int legal=0;for(int i=1;i<=n;i++)if(c[i]){int best=x^a[i];if(best<a[i]) legal+=b[i];else{int delta=best-a[i];if(!delta) continue;for(int j=1;j<=pcnt&&i*p[j]<=n;j++) if(a[i*p[j]]>=delta) legal++;}}int all=0;for(int i=1;i<=n;i++) (all+=1LL*a[i]*b[i]%MOD)%=MOD;int ans=1LL*legal*fmi(all,MOD-2)%MOD;printf("%d\n",ans<0?ans+MOD:ans);
}
int main(){sieve();readData();solve();return 0;
}

转载于:https://www.cnblogs.com/RogerDTZ/p/9439644.html

【洛谷P4706】取石子相关推荐

  1. 洛谷 P4706 取石子 解题报告

    P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...

  2. 洛谷P2252 取石子游戏(威佐夫博弈)

    题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  3. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  4. 洛谷——P1226 取余运算||快速幂

    P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...

  5. 洛谷P1288 取数游戏II[博弈论]

    题目描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流 ...

  6. 洛谷----P1123 取数游戏

    题目描述 一个N×M的由非负整数构成的数字矩阵,你需要在其中取出若干个数字,使得取出的任意两个数字不相邻(若一个数字在另外一个数字相邻8个格子中的一个即认为这两个数字相邻),求取出数字和最大是多少. ...

  7. 洛谷 P1775 合并石子(弱化版)

    文章目录 合并石子(弱化版) 一.题目描述 二.思路 三.代码 合并石子(弱化版) 一.题目描述 https://www.luogu.com.cn/problem/P1775 设有 N(N \le 3 ...

  8. 洛谷P1880 [NOI1995]石子合并

    放题解 题目传送门 放代码 转载于:https://www.cnblogs.com/liuyuxinblog/p/10799085.html

  9. 洛谷刷题C语言:Olivander、取石子、Davor、标题统计、成绩

    记录洛谷刷题QAQ 一.[COCI2017-2018#5] Olivander 题面翻译 题意简述 有 n n n 个棍子和 n n n 个盒子,要求每个盒子里放的棍子的总长度不能超过盒子的高度.求是 ...

  10. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

最新文章

  1. 为什么我的elec352稍微有点崩
  2. K8s卸载清理flannel插件清理
  3. 怎么在终端启用python_在终端启动Python时报错的解决方案
  4. ar面部识别_国内手机厂商AR布局报告
  5. java项目 导出_Java项目的导入和导出
  6. 初学C#和MVC的一些心得,弯路,总结,还有教训(4)--Cache 关于创建多个缓存实例
  7. html展示值 vue_vue在html使用
  8. 使用qemu模拟X86处理器加载linux kernel+busybox文件系统并调试
  9. WITH TIES语句(SQL)
  10. android 自定义locale,关于android:设置Locale.setDefault(locale)后,如何获取手机语言?...
  11. 深度学习-感受野与有效感受野
  12. vue引入TweenMax.js
  13. 制造业数字化转型关键问题有哪些?
  14. 基于51单片机智能大棚智能花盆浇水浇花灌溉补光散热原理图Proteus仿真
  15. 微信二维码获取账号权限——Netting-QRLJacking分析利用
  16. 安卓手机怎么下载java游戏
  17. 交叉验证(Cross-Validation)
  18. 3DsMax安装教程
  19. 毕业后我这操蛋的五年
  20. C语言编程实现,计算每天进步一点点一年后的效果

热门文章

  1. 蛋疼! 注意了,千万不要在 MySQL 中使用 UTF-8
  2. 是真的!华为2019年应届博士年薪最高达201万
  3. Google深度学习TensorFlow最好的入门文章!
  4. 从直播CDN的原理说起,谈如何解决延时和连麦的老难题?
  5. 苹果爸爸发飙,封杀 React Native?
  6. 以产品思维去做微信公众号
  7. python基本执行方式_Python开发的3种命令执行方法
  8. python代码300行程序_Python小游戏之300行代码实现俄罗斯方块
  9. *第九周*数据结构实践项目一【猴子选大王(数组)】
  10. js 难点之原型理解