zoukankan      html  css  js  c++  java
  • 【计蒜客习题】取石子游戏

    问题描述

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

    输入格式

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

    对于每局游戏,输入 3 个整数 n(2n20000),a,b(1a,bn),保证 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


    这大概是我博客上贴的第一道数论的题目。。。

    数论的话,如果理论强大,题目还是很水的。这道题就考察了最大公约数的一个性质:gcd(a,b)=ma+nb。a的m倍和b的n倍可以表示a和b的最大公约数,自然可以表示gcd(a,b)的整数倍,也就是说,所有编号是a和b整数倍的石子均可被取出。这样求出a和b的最大公约数,再枚举他的若干倍,只要不超过n,都是可以取出的石子,统计可取出石子的数量,分奇偶讨论即可。

     1 #include<cstdio>
     2 int gcd(int a,int b) {
     3     return b==0?a:gcd(b,a%b);
     4 }
     5 int main() {
     6     int t,n,a,b;
     7     scanf("%d",&t);
     8     for(;t;--t) {
     9         scanf("%d%d%d",&n,&a,&b);
    10         int g=gcd(a,b),cnt=0;
    11         for(int i=1;i*g<=n;++i) ++cnt;
    12         if(cnt%2) printf("huaye");
    13         else printf("suantou");
    14         if(t!=1) printf("
    ");
    15     }
    16     return 0;
    17 }
    AC代码
  • 相关阅读:
    javascript设计模式小记
    静态iframe异步加载
    博客搬家分割线
    大数据学习之MapReduce篇
    IDEA 创建javaWeb以及Servlet
    数组定义 二维数组 数组遍历 查找
    201720181 JAVA实验站 第二周作业
    201720181 JAVA实验站 第三周作业
    201720181 团队名称 第一周 作业
    C#语言编写的基于directshow的音视频格式转换
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/9715818.html
Copyright © 2011-2022 走看看