Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 24    Accepted Submission(s): 22


Problem Description
k. Each pagoda can not be rebuilt twice.

This is a game for them. The monk who can not rebuild a new pagoda will lose the game.
 

Input
The first line contains an integer b.
 

Output
For each test case, output the winner (``Yuwgna" or ``Iaka"). Both of them will make the best possible decision each time.
 

Sample Input
16 2 1 2 3 1 3 67 1 2 100 1 2 8 6 8 9 6 8 10 6 8 11 6 8 12 6 8 13 6 8 14 6 8 15 6 8 16 6 8 1314 6 8 1994 1 13 1994 7 12
 

Sample Output
Case #1: Iaka Case #2: Yuwgna Case #3: Yuwgna Case #4: Iaka Case #5: Iaka Case #6: Iaka Case #7: Yuwgna Case #8: Yuwgna Case #9: Iaka Case #10: Iaka Case #11: Yuwgna Case #12: Yuwgna Case #13: Iaka Case #14: Yuwgna Case #15: Iaka Case #16: Iaka
 
 

 

 

 

题意:给定n个位置(1 — n),每个位置只能建造一个塔。现在位置a和b已经建好了塔,已知每次可以新建塔的前提——能够找到两个塔j和k使得 i = j-k || i = j+k。

现在给出一个博弈局面,当某个人不能再建造塔时为输。问你谁能赢。

 

思路:当且仅当 a和b处于某个等差数列(差值不为1)时,才无法使得所有位置都建上塔。相反,则n个位置均可建塔。等差数列的差值 d = gcd(a, b),求出可以建塔的个数就可以了。

代码:

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 int gcd(int x,int y){
 8     return !y?x:gcd(y,x%y);
 9 }
10 int main(){
11     int T,flot=0;
12     int n,a,b;
13     scanf("%d",&T);
14     while(T--){
15         scanf("%d%d%d",&n,&a,&b);
16         int t=gcd(a,b);
17         //printf("%d\n",t);
18         int temp=n/t-2;
19         if(temp&1)printf("Case #%d: Yuwgna\n",++flot);
20         else printf("Case #%d: Iaka\n",++flot);
21     }
22     return 0;
23 }

 

相关文章: