Two monks, Yuwgna and Iaka, decide to make glories great again. They take turns to build pagodas and Yuwgna takes first. For each turn, one can rebuild a new pagodas labelled i (i∉{a,b} and 1≤i≤n) i (i∉{a,b} and 1≤i≤n) if there exist two pagodas standing erect, labelled j j and k k respectively, such that i=j+k i=j+k or i=j−k i=j−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.
For each test case, the first line provides the positive integer n (2≤n≤20000) n (2≤n≤20000)and two different integers a a and b b.
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
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: IakaCase #16: Iaka
题目大意:两个人建塔,一共有n个塔,但是有两个塔不用建,为i,j,两个人建的塔只能k=i+j或k=i-j;谁不能建塔谁输;
解题思路:这个看似博弈的一个题目,却是一个找规律的题目,因为建塔只能是k=i+j或k=i-j,我们可以发现他们可以建的塔最小位置就是i和j的最大公约数,而其余的塔都可以在基础上加长这个最大公约数,也就是这个数的所有的倍数,然后我们在看n里面含有多少个这样的数就行了;然后减去原本两个不用建的,然后判断这样的数的奇偶个数;
#include <iostream> #include<cstdio> using namespace std; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { int T,n,a,b; scanf("%d",&T); int s=0; while(T--) { s++; scanf("%d%d%d",&n,&a,&b); int tmp=gcd(a,b); n=n/tmp-2; printf("Case #%d: ",s); if(n%2==0) cout<<"Iaka"<<endl; else cout<<"Yuwgna"<<endl; } //cout << "Hello world!" << endl; return 0; }