【计蒜客习题】 取石子游戏(gcd)

问题描述

蒜头君和花椰妹在玩一个游戏,他们在地上将 n 颗石子排成一排,编号为 1 到 n。开始时,蒜头君随机取出了 2 颗石子扔掉,假设蒜头君取出的 2 颗石子的编号为 a, b。游戏规则如下,蒜头君和花椰妹 2 人轮流取石子,每次取石子,假设某人取出的石子编号为 i,那么必须要找到一对 j, k 满足 i=j−k 或者 i=j+k ,并且编号为 j,k 的石子已经被取出了,如果谁先不能取石子了,则视为输了。蒜头君比较绅士,让花椰妹先手。

输入格式

第一行输入一个整数 t(1≤t≤500),表示蒜头君和花椰妹进行了 t 局游戏。

对于每局游戏,输入 3 个整数 n(2≤n≤20000),a,b(1≤a,b≤n),保证 a,b 不相等。

输出格式

如果蒜头君赢了游戏,输出一行suantou,如果花椰妹赢了,输入一行huaye。

样例输入

5

8 6 8

9 6 8

10 6 8

11 6 8

12 6 8

样例输出

suantou

suantou

huaye

huaye

suantou

解题思路:

设 d=gcd(a,b),那么 a,b 都是 d 的倍数,a+b和a-b也一定是 d 的倍数。然后看 1~n 范围内有多少个数是 d 的倍数,奇数个就是先手赢,偶数个就是后手赢。

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3
 4 using namespace std;
 5
 6 int t,a,b,n;
 7
 8 int gcd(int k,int l) {
 9     if(l == 0) {
10         return k;
11     }
12     gcd(l,k % l);
13 }
14
15 int main()
16 {
17     scanf("%d",&t);
18     while(t--) {
19         scanf("%d%d%d",&n,&a,&b);
20         int u = gcd(a,b),ans = 0;
21         for(int i = u;i <= n; i += u)
22             ans++;
23         string p = (ans % 2 == 0) ? "suantou" : "huaye";
24         cout << p << endl;
25     }
26     return 0;
27 }

原文地址:https://www.cnblogs.com/lipeiyi520/p/10467821.html

时间: 2024-08-30 05:48:33

【计蒜客习题】 取石子游戏(gcd)的相关文章

计蒜客 16877 卡牌游戏

题目链接:https://nanti.jisuanke.com/t/16877 题目大意:桌子上有N堆牌,每堆牌有Si张,每张牌上有个数.小明和小红玩游戏,小红女士优先,每次从任意一个牌堆顶部取出一张,小明长得丑,每次从任意一个牌堆底部取一张.假设他俩都按照最优的方式取牌,那么谁最后得到的所有牌的数字的和大. 解题思路:首先我们考虑牌个数为偶数的几堆,那么你会发现,无论小红选哪儿个,小明只要跟着她选对应牌堆底部的,那么他俩总会各选顶部或底部一半牌,而且无论谁先手都是一样,显然这样也是最优的(我不

【计蒜客习题】圣诞树

问题描述 圣诞节快到了,蒜头君准备做一棵大圣诞树.这棵树被表示成一组被编号的结点和一些边的集合,树的结点从 1 到 n 编号,树的根永远是 1.每个结点都有一个自身特有的数值,称为它的权重,各个结点的权重可能不同.对于一棵做完的树来说,每条边都有一个价值 ve,若设这条边 e 连接结点 i 和结点 j,且 i 为 j的父结点(根是最老的祖先),则该边的价值ve=sj*we,sj表示结点 j 的所有子孙及它自己的权重之和,we表示边 e 的权值.现在蒜头君想造一棵树,他有 m 条边可以选择,使得树

计蒜客-题库-跳跃游戏2

题目 给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 你的目标是到达最后一个下标,并且使用最少的跳跃次数. 例如: A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 2.(先跳跃 1步,从下标 0到 1,然后跳跃 3 步,到达最后一个下标.一共两次) 输入格式 第一行输入一个正整数 n(1≤n≤100),接下来的一行,输入 n个整数,表示数组 A. 输出格式 最后输出最少的跳跃次数. 样例输入 5 3 1 1 1 1 样

【计蒜客习题】蒜头君运送宝藏

!!!原来LCA的题可以出的这么难,完了这还属于水题?! 先来解释一下题意,有N个城市,在这N城市之间有M条边(不一定每个城市都有边).我们的任务是找出给定两个点之间路径上的最小边权,使得这个最小边权尽量大.一开始我很纳闷,这和LCA有什么关系呢,怎么和最大流有点像.冥思苦想(看了别人的想法)之后,哦,原来是最大生成树+LCA...因为是最大生成树,可以使得任意两点间路径上的最大边权最大(再连上较小的会成环).这样问题就变成了找树上两点间路径上的最小边权,显然可以利用LCA,这是他十分经典的应用

【计蒜客习题】 蒜头君的猜想(埃氏筛)

解题思路: 从1到n将所有数筛一遍,枚举加数,如果这两个加数都是质数,那么方案数加1. AC代码: 1 #include<cstdio> 2 3 using namespace std; 4 5 int n,ans; 6 bool vis[8000001]; 7 8 int main() 9 { 10 scanf("%d",&n); 11 for(int i = 2;i * i <= n; i++) 12 if(!vis[i]) { 13 for(int j

bzoj 1874 取石子游戏 题解 &amp;amp; SG函数初探

[原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 334  Solved: 122 [Submit][Status] Description 小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这种,每一个人每次能够从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,假设有,第一步怎样取石子. In

hdu1527 &amp; poj1067 取石子游戏 威佐夫博奕模型,,模板题o(╯□╰)o

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35727   Accepted: 12065 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

bzoj 1874 取石子游戏 题解 &amp; SG函数初探

[原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 334  Solved: 122 [Submit][Status] Description 小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如果有,第一步如何取石子. In

hdu 2516 取石子游戏 Fibonacci博弈 入门题

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3069    Accepted Submission(s): 1784 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win&q