#7165. hyk 的海盗游戏

0
    ID: 7165 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 5 上传者: 标签>2025提高班模拟赛(13)模拟链表GCDBFSCSP-S

hyk 的海盗游戏

hyk 的海盗游戏

题目描述

hyk 最近在玩一款游戏

这款游戏中,玩家们要扮演海盗在海上打捞发掘宝藏,每次出发需要凑足 nn 个玩家,以入队顺序编号分别为 1∼n1 \sim n

在找到宝藏以后,玩家们需要进行一轮 "内战" 来让自己获得更多的宝藏

"内战" 的规则是这样的:

所有人站成一圈,每回合所有玩家会同时向自己顺时针方向的下一个玩家进行一次攻击

对于两个编号为 x,yx,y 的玩家,如果这一回合游戏是 xx 向 yy 发动攻击,若 x,yx,y 的最大公约数不为 11,则认为此次攻击有效,那么 yy 将出局

例如有五个玩家 x1,x2,x3,x4,x5x1,x2,x3,x4,x5 排成一圈

第一回合满足 gcd(x2,x3)!=1gcd(x2,x3) != 1 则 x3x3 出局,剩余 x1,x2,x4,x5x1,x2,x4,x5

第二回合满足 gcd(x1,x5)!=1,gcd(x1,x2)!=1gcd(x1,x5) != 1,gcd(x1,x2) != 1 则 x1,x2x1,x2 出局,剩余 x4,x5x4,x5

第三回合发现 gcd(x4,x5)==1gcd(x4,x5)==1,则游戏结束

现在 hyk 想知道,如果已经知道 nn 个玩家一开始的站位,能有多少个玩家留到最后均分宝藏?

输入格式

第一行 n,m,Kn,m,K,其中 nn 是人数,m,Km,K 为生成初始站位的参数

这 nn 个人的初始站位由以下代码生成,生成的 a[i]a[i] 即为第 ii 个人的编号

// 请注意生成函数中的所有类型必须为 int int K; int get_number(){ K = K * 214013 + 2531011; return (abs(K)) % n + 1; }

for (int i = 1; i <= n; ++i){ a[i] = i; } for (int i = 1; i <= m; ++i){ x = get_number(), y = get_number(); swap(a[x], a[y]); }

输出格式

输出一个整数,表示能留到最后的玩家个数

数据范围

对于 50%50\% 的数据:n≤1000n\leq 1000。

对于 80%80\% 的数据:n≤105n\leq 10^5。

对于 100%100\% 的数据:1≤n≤106,m≤106,K1\leq n\leq 10^6,m\leq 10^6,K 在 intint 范围内。

样例输入1

6 0 0

样例输出1

6

样例输入2

100000 100000 99997

样例输出2

55942