首页 > 其他分享 >LGP10702 [SNCPC2024] 下棋题解

LGP10702 [SNCPC2024] 下棋题解

时间:2024-08-23 11:52:11浏览次数:3  
标签:SNCPC2024 题解 石子 个数 先手 mod 末尾 LNC LGP10702

P10702 [SNCPC2024] 下棋

本蒟蒻的第一篇题解

定位 博弈论(nim)+进制转换

相关知识

OI WIKI

博弈论NIM

进制转换

正题

读题

所有
k 进制下所有数位的乘积为自身因子的数。他称之为 LNC 数。
给出 x 枚棋子,然后 LNC 选定一个整数 k (k≥2) 。随后他们交替取走若干枚棋子,要求取走的棋子数量是 k 进制意义下的 LNC 数。LNC 先手,先取完的获胜。两个人都绝顶聪明,故都会选择最优的策略。

观察

LNC数的特性:

如果一个数在
k 进制下是 LNC 数,那么这个数的各数位(除了前导零外)不能包含其他的 0。

特别地,末尾不能为 0。

博弈策略:

如果先手时石子个数末尾为 0,则先手必败。

如果先手时石子个数末尾非 0,则先手必胜。

思路(证明)

情况1:

先手时石子个数末尾为 0假设石子个数在
k 进制下表示为
n,且
n 的末尾为 0。这意味着
n 可以表示为 n=m⋅kn=m⋅k ,其中 m 是一个整数。

先手操作:

先手拿走任意数量的石子后,石子个数 n 必然不再为k 的倍数,即 $ n≡ 0 (mod k) $ 不成立

后手操作:

后手可以拿走 n 的末尾个石子,使得 n 再次变为 k 的倍数,即 $ n≡ 0 (mod k) $ 成立

重复过程:

每次先手操作后,后手总能通过拿走末尾个石子使得石子个数再次变为 k 的倍数。这个过程会一直持续,直到石子个数变为 0。

结论:

由于先手每次操作后,后手总能使得石子个数末尾恢复为 0,最终先手会遇到没有石子可以拿的局面,因此先手必败。

情况2:

先手时石子个数末尾非 0

假设石子个数在 k 进制下表示为 n,且 n 的末尾非 0。这意味着
n≡ 0 (mod k) 不成立

先手操作:

先手可以选择拿走末尾个石子,使得石子个数 n 变为 k 的倍数,即 n≡ 0 (mod k)

后手操作:

后手在这种情况下无论如何操作,石子个数
n 都会变为非 0

重复过程:

每次先手操作后,后手操作使得石子个数末尾非 0。

这个过程会一直持续,直到石子个数变为 0。

结论:

由于先手每次操作后,后手操作使得石子个数末尾非 0,最终后手会遇到没有石子可以拿的局面,因此先手必胜。

结论
通过上述分析,我们可以得出以下结论:

如果先手时石子个数末尾为 0,则先手必败。

如果先手时石子个数末尾非 0,则先手必胜。

实现方法

解决原问题

我们需要找到一个
k,使得 n≡ 0 (mod k)

具体步骤如下:

枚举 k:

从 2 开始枚举
k,直到找到一个
k 使得
n≡ 0 (mod k)

时间复杂度分析:

由于n 的范围是 (3≤x≤1e18 )
,我们需要确保枚举
k 的时间复杂度是可接受的。
实际上,枚举
k 的时间复杂度是
O(log n) ,因为
k 只需要枚举到
n 的因数范围内。
代码

#include<bits/stdc++.h>
using namespace std;
#define int long  long
int k,x,T;
int tim(int x) {   //博弈论函数
	for (int base = 2; base <= x; base++) {
		int temp = x;
		if(temp%base==0)continue; //如果n≡0(modk)
		else return  base;
	}
}
signed main(){
	cin>>T;
	for(int i=1;i<=T;i++){
		cin>>x;
		cout<<tim(x)<<endl;
	}
	return 0;
}

标签:SNCPC2024,题解,石子,个数,先手,mod,末尾,LNC,LGP10702
From: https://www.cnblogs.com/small-mushroom/p/18375696

相关文章

  • 【题解】Solution Set - NOIP2024集训Day14 CDQ分治
    【题解】SolutionSet-NOIP2024集训Day14CDQ分治https://www.becoder.com.cn/contest/5482「CF364E」EmptyRectangles*3000摆烂了。「SDOI2011」拦截导弹CDQ的例题,之前做过(现在试图自己再做出来。第二问只用在第一问里面记录每一次是从哪个\(j\)​转移过来的,以及......
  • P10559 [ICPC2024 Xi'an I] The Last Cumulonimbus Cloud 题解
    这种题有一个常见的根号分治做法:设\(d\)为度数,显然有\(O(1)\)修改单点,\(O(d)\)查询邻域和\(O(d)\)修改邻域,\(O(1)\)查询单点两种暴力。对度数大于\(\sqrtn\)的点使用前者,度数小于等于\(\sqrtn\)的点使用后者,可以做到\(O(m\sqrtn)\)的时间复杂度。这种做法的本......
  • CF1575G GCD Festival 题解
    考虑欧拉反演\[\sum\limits_{d\midn}\varphi(d)=n\]则原式可以化为\[\begin{align*}&\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(a_i,a_j)\cdot\gcd(i,j)\\=&\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(a_i,a_j)\sum\li......
  • CF163E e-Government 题解
    题目传送门前置知识AC自动机|树状数组解法一次性将所有模式串加入AC自动机,然后处理加入和删除,考虑单次操作对答案的贡献。因为模式串\(T\)在文本串\(S\)中出现的次数之和等价于\(T\)在\(S\)的所有前缀中作为后缀出现的次数之和。这就很和\(fail\)树上跳到根节......
  • [题解] permutation
    [题解]Permutation解析一眼DP或者组合。70pts场上推的DP对于\((4,2,2)\),先把所有序列枚举出来:\[\begin{split}1\\\2\\1\\\3\\1\\\4\\--\\2\\\3\\2\\\4\\3\\\4\end{split}\]可以发现,对于分割线上的部分,可以看作\((3,1,1)\)的所有序列......
  • csp模拟27-金箱子(题解)
    题目链接(显然还没有找到原题)虽说我现在才学会期望dp显得不太好,但没办法,谁让我比较菜~~,之前模拟赛已经考过几道类似的题了,但都一笔带过了,这次算是正式学习了一下这类题,于是就有了这篇题解。首先看到k次方首先想到的就是我们在进行dp转移的时候不太方便,这个时候很自然的想到二项......
  • 题解:P9041 [PA2021] Fiolki 2
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的DAG,定义\(f(l,r)\)表示最多选取多少条不相交路径\((s_i,t_i)\)满足\(s_i\in[1,k],t_i\in[l,r]\),其中不能有任意一点同时在两条选出的路径上。对\(\forallx\in[0,k)\)求出有多少\([l,r]\sube(k,n]\)使得\(f(l,r)......
  • 题解:P10881「KDOI-07」能量场
    \(\text{Link}\)题意给你一个长为\(n\)的序列\(a_{1\dotsn}\),定义一条边\((u,v)\)的权值为\(a_u+a_v\)。对于一张图,定义其权值为包含的所有边的权值乘积。求所有\(n\)个点的有标号基环树的权值之和。对\(998244353\)取模。\(n\le10^3\)。思路非常厉害的题,zky倾......
  • 题解:P10698 [SNCPC2024] 最大流
    \(\text{Link}\)题意给定一个\(n\)个点\(m\)条边的单位网络,保证该网络不存在环。给定一个常数\(k\),设从\(1\)到\(i\)的最大流为\(f_i\),对\(\foralli\in[2,n]\)求出\(\min(f_i,k)\)。\(n\le10^5\),\(m\le2\times10^5\),\(k\le\min(n-1,50)\)。思路不相交路径,考......
  • 升级Openssh 后 最大文件打开数修改不生效,启动 UsePAM yes后 ,最大文件打开数生效但是
    感谢 博主https://blog.csdn.net/Daphnisz/article/details/124040904vi /etc/pam.d/sshd(注意不是/etc/pam.d/sshd.pam)#%PAM-1.0auth required pam_sepermit.soauthsubstackpassword-authauthincludepostlogin#Usedwithpolkittoreauthor......