洛谷 Roy&October之取石子】的更多相关文章

题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取pk 个(p为质数,k为自然数,且pk小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了. 现在October先取,问她有没有必胜策略. 若她有必胜策略,输出一行"October wins!":否则输出一行"Roy wins!". 输入输出格式 输入格式: 第一行一个正整数T,表示测试点组数. 第2行~第(T+1)行,一行一个正整数n,表示石子个…
洛谷 P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质数,k为自然数,且 p^kpk 小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了. 现在October先取,问她有没有必胜策略. 若她有必胜策略,输出一行"October wins!":否则输出一行"Roy wins!". 输入输出格式 输入格式: 第一行一个正整…
P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取p^kpk个(p为质数,k为自然数,且p^kpk小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了. 现在October先取,问她有没有必胜策略. 若她有必胜策略,输出一行"October wins!":否则输出一行"Roy wins!". 输入输出格式 输入格式: 第一行一个正整数T,表示测试…
题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被4整除就是必胜态,只要能被4整除就是必败态. 实现代码如下: #include <bits/stdc++.h> using namespace std; int T, n; int main() { cin >> T; while (T --) { cin >> n; pu…
题目背景 \(Roy\)和\(October\)两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有\(n\)个石子,两人每次都只能取\(p^k\)个(\(p\)为质数,\(k\)为自然数,且\(p^k\)小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了. 现在\(October\)先取,问她有没有必胜策略. 若她有必胜策略,输出一行"\(October wins!\)":否则输出一行"\(Roy wins!\)". 输入输出格式 输入格式: 第一行一…
题面 HDU1527 取石子游戏 洛谷2252 取石子游戏 题解 裸的威佐夫博弈 #include<iostream> #include<cmath> using namespace std; const double phi=(sqrt(5)+1)/2; int a,b; int main() { ios::sync_with_stdio(false); while(cin>>a>>b) { if(a>b)swap(a,b); int A=abs(a…
题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质数,k为自然数,且 p^kpk 小于等于当前剩余石子数),谁取走最后一个石子,谁就赢了. 现在October先取,问她有没有必胜策略. 若她有必胜策略,输出一行"October wins!":否则输出一行"Roy wins!". 输入输出格式 输入格式: 第一行一个正整数T,表示测试点组数. 第2行~第(T+1)行,一行一个正…
bzoj1413 洛谷P2599 根本不会啊... 看题解吧 #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back typedef long long ll; typedef…
题目链接:https://www.luogu.org/problem/P4018 首先碰到这道题目还是没有思路,于是寻思还是枚举找一找规律. 然后写了一下代码: #include <bits/stdc++.h> using namespace std; const int maxn = 101; bool win[maxn]; bool isp(int a) { if (a < 2) return false; for (int i = 2; i * i <= a; i ++) i…
题目链接 思路 这个题思路挺巧妙的. 情况一: 首先如果这堆石子的数量是1~5,那么肯定是先手赢.因为先手可以直接拿走这些石子.如果石子数量恰好是6,那么肯定是后手赢.因为先手无论怎样拿也无法直接拿走六个石子. 情况二: 考虑继续推广,如果石子数是7~11,那么先手也能赢.因为先手可以先拿成6,然后就变成了情况1.如果石子数是12,那么一定是后手赢.因为根据上面讨论,当石子数量为6的时候,此时的先手一定输.如果石子数量为12,那么现在的人无论如何也无法拿成6,所以肯定会输. 结论 如果石子数是6…
题意 题解 如果n是6的倍数,先手必败,否则先手必胜. 因为6*x一定不是pk 所以取得话会变成6*y+a的形式a=1,2,3,4,5: 然后a一定为质数.我们把a取完就又成为了6*x的形式. 又因为总数不断减少,所以6*x的局面是必败局面. 做完这题让我想起了初中时就被这种问题被人坑过. 然后博弈论可以先把SG的表打出来. #include<iostream> #include<cstring> #include<cstdio> #include<cstring…
题目链接 思路 这个题和上个题类似,仔细推一下就知道这个题是判断是否是4的倍数 代码 #include<cstdio> #include<iostream> #define fi(s) freopen(s,"r",stdin); #define fo(s) freopen(s,"w",stdout); using namespace std; typedef long long ll; ll read() { ll x = 0,f = 1;c…
4的倍数不行,之间的数都可以到4的倍数,而6的倍数不能到4的倍数 #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 1000010 #define p(a) putchar(a) #define F…
考虑到先手和后手都使用最优策略,所以可以像对抗搜索一样,设 \(val\) 为先手收益减去后手收益的值.那么先手想让 \(val\) 尽可能大,后手想让 \(val\) 尽可能小. 继续分析题目性质,发现取石子的过程可以转化为两端分别有一个栈,可以从栈顶取石子,中间有若干个双端队列,可以从其两端取石子. 如果取一个位置后,接下来的位置比刚才取的那个位置权值小,也就是从选择方向开始权值是递减的,每次决策肯定都是取当前局面权值最大的位置.如果不保证递减,就有可能取完一个位置后,使得一个权值更大的位置…
https://www.luogu.org/problem/show?pid=1005   dp好想,高精度练手题,有点不舒服的是前后取数位置的计算,代码量太少才会写题这么慢,noip之前虽然重点放在知识点补全上但是基础还是要打扎实. 代码 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<qu…
矩阵取数游戏 题目链接 每行分别跑一趟区间DP即可 这道题区间DP是非常裸的,按套路来即可 但是很毒瘤的是需要高精度, “我王境泽就是爆零,从这跳下去,也不会用__int128的!” #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define int __int128 //真香 #define reset(a) memset(a,0,sizeof(a)) #defi…
题目链接 一道人类智慧的dp题 首先我们可以将∑ai^2转化为求取两次,两次一样的方案数 然后用f[i][j][k][l]表示第一个人在第一个串中取到i第二个串中取到j 第二个人在一个串中取到k第二个串中取到l的方案数 显然i+j=k+l,所以第四维可以省掉 推出方程后,可以看出f[i][j][k][l]只与f[i]与f[i-1]有关,所以可以用滚动数组优化 // luogu-judger-enable-o2 # include<iostream> # include<cmath>…
刷水题. 传送门 看似高精而非高精乃是此题最大亮点. 边读边取模技能get~ #include<cstdio> #define ll long long #define mod 19260817 ll read() { ll ret=;char c=getchar(); ')c=getchar(); *ret+c-')%mod,c=getchar(); return ret; } ll ksm(ll b,int p) { ll ret=; while(p) { )ret=(ret*b)%mod…
费用流 又是一道网络流的模型,对于这种费用与经过次数有关的边,我们经常把边拆成多条,比如这个题,第一次费用是x,第二次是0,我们就可以先把点拆成入点和出点,入点和出点又连两条边,第一条容量为1,费用为x:第二天容量为k-1,费用为0,意思很明确,第一次的流量可以得到费用,其他的流量都得不到费用. 原图坐标与坐标之间也连上容量为k,费用为0的边. 这样能保证网络中的最大流一定是k.(因为把源点当成(1,1)的入点,那么源点与他的出点只有k的容量). 我们在这个网络中跑最大费用最大流即可. #inc…
P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些棋子,其中第 \(i\) 个点放置了 \(a_i\) 个棋子.接下来,从 Yopilla 开始操作,双方轮流操作,谁不能操作谁输.每次的操作是:当前操作方选定一个有棋子的点 \(x\) ,然后选择至少一个点 \(x\) 上的棋子,然后把这些棋子全都移动到点 \(x / prime\)上,其中 \(p…
题目背景 无 题目描述 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者. 输入输出格式 输入格式: 输入共一行. 第一行共两个数a, b,表示石子的初始情况. 输出格式: 输出共一行. 第一行为一个数字1.0或-1,如果最后你是胜利者则为1:若失败则为0:若结…
P2252 取石子游戏 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者. 这题比较狗☞,要开$long$$long$ 所谓的威佐夫博弈,貌似应用的只是他的结论,两个绝绝顶聪明的人,在玩一个灰常高大上的游戏——取石子, 即给你两堆石子,两个人轮流取,可以取走其中…
链接: P2252 [SHOI2002]取石子游戏|[模板]威佐夫博弈 前言: 第一眼大水题,第二眼努力思考,第 N 眼我是大水逼. 题意: 不看题目标题都应该能看出来是取石子类的博弈论. 有两堆石子,可以在任意一堆取走任意正整数的石子,也可以同时在两堆中取走相同任意正整数的石子.判断当前状态. 分析: 这就是大名鼎鼎的威佐夫博弈了. 本着不会正解就暴力打表的思想,我们可以打出暴力,这其实是解决本题的关键所在.在暴力中我们可以发现只有以下状态先手必败: \((0,0),(1,2),(3,5),(…
题目链接:https://www.luogu.org/problemnew/show/P1247 题意:nim取石子的题意,多了一个判断先手赢的话,输出先手第一把怎么拿,以及拿完之后每堆还剩多少. 题解:异或和为0直接lose.不为0的话,看res xor a[i]的值如果小于a[i]说明可以取该堆,也就是取a[i] - (res xor a[i])这么多.剩余的就是res xor a[i]. 证明..洛谷题解的大佬写的挺好的..QAQ 代码: #include <iostream> #inc…
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 输入输出样例 输入样例#1: 2 10 9 输出样例#1: 2^10 mod 9=7 这道题有各种各样的做法,来整理一下几种思路吧 做法1(来自一本通) 思路 1.本题主要的难点在于数据规模很大(b…
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样…
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P1004 设\(f[i][j][k][l]\)表示第一条路从\((1,1)\)走到\((i,j)\),第二条路从\((1,1)\)走到\((k,l)\)能取的最大权值. 然后直接暴力四种更新.洛谷题解对于优化也讲了不少.(省选前刷这种水题是不是搞错了什么) 时间复杂度:\(O(n^4)\) 空间复杂…
codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最小代价.则有$f[i][j]=min(f[i][k]+f[k+1][j]+\sum\limits _{l=i}^{j}a[l])$,时间复杂度$O(n^3)$. C++ Code: #include<cstdio> #include<cstring> using namespace s…
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价达到最小. 输入描述 Input Description 第一行一个整数n(n<=100) 第二行n个整数w1,w2...wn  (wi <= 100) 输出描述 Output Description 一个整数表示最小合并代价 样例输入 Sample Input 4 4 1 1 4 样…
洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 否则先手必败. #include<stdio.h> #include<string.h> using namespace std; const int maxn = 25; int a[maxn], n, ans…