Evanyou Blog 彩带

2月4日考试——欢乐斗地主

                欢乐斗地主
                 时限:1s
               内存限制:128MB
题目描述:
  Ning_Mew 最近有玩欢乐斗地主(不能歧视我菜),脑子再次一热,就改成了一道很水很水的题。
小 Mew 和朋友小 Ning 一起玩游戏,两个人轮流取纸牌,告诉你一共有 n 张纸牌,每次可以取 1~m 张,每
次小 Mew 都可以先手(谁要他巨呢),假设两个人都是高智商,都只会去取最有可能赢的数量的牌。所以呢想要
问你,小 Mew 第一次要取多少张牌才能稳赢~实在稳赢不了,就输出“She Pi Guai Wu!”(不包括引号)
赢的定义就是取最后一张。_(:3 / )_
读入格式:
第一行:q(表示读入 q 行 n 与 m)----->多测
第二至 q+1 行:每行读入 n,m
输出格式:
第一至 q 行:每行,如果能稳赢,输出第一次取的纸牌数量;否则,输出“She Pi Guai Wu!”(不包括引号)。
样例输入:
1
42
样例输出:
1
样例解释:
这还要解释?
数据范围:
10%: q<=10
n,m<=100
40%: q<=100
n,m<=1000
60%: q<=1000
n,m<=10000
80%: q<=10000
n,m<=10000
100%: q<=100000 n,m<=1000000

 

Solution:

  本题考察数学,实际上是小学奥数的推广。大家应该都还记得小学奥数中经典的分纸牌的游戏吧,就是给出54张牌,一次能拿1到4张牌,问先手第一次拿几张牌能赢。。。答案是先手拿4张牌,这样剩下50张牌,无论对手拿x张,我拿5-x张,最后一张牌一定是先手拿到。。。推及到本题,有n张牌,每次最多拿m张,那么若n%(m+1)==0,则先手必输(因为无论先手拿x张,后手都能拿到m+1-x张),若n%(m+1)!=0,则先手必赢,策略是先拿n%(m+1)张牌。

代码:

 1 /*小学奥数中的分纸牌问题,开始还以为是nim游戏,打了个dp但数据呵呵——by 520*/
 2 #include<bits/stdc++.h>
 3 #define il inline
 4 #define ll long long 
 5 using namespace std;
 6 int n,m,q;
 7 il int gi()
 8 {
 9     int a=0;char x=getchar();bool f=0;
10     while((x<'0'||x>'9')&&x!='-')x=getchar();
11     if(x=='-')x=getchar(),f=1;
12     while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
13     return f?-a:a;
14 }
15 int main()
16 {
17     freopen("card.in","r",stdin);
18     freopen("card.out","w",stdout);
19     q=gi();
20     while(q--){
21         n=gi(),m=gi();
22         if(n%(m+1))printf("%d\n",n%(m+1));
23         else printf("She Pi Guai Wu!\n");
24     }
25     return 0;
26 }

 

posted @ 2018-02-04 14:31  five20  阅读(185)  评论(0编辑  收藏  举报
Live2D