|
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 }