1. 程式人生 > >Pagodas (找規律)

Pagodas (找規律)

n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, labelled from 1 to n. However, only two of them (labelled a and b, where 1≤a≠b≤n) withstood the test of time.

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) if there exist two pagodas standing erect, labelled j and k respectively, such that i=j+k or 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.

Input

The first line contains an integer t (1≤t≤500)

which is the number of test cases.
For each test case, the first line provides the positive integer n (2≤n≤20000) and two different integers a and 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,a,b,一開始集合裡面有兩個數:a和b,然後兩個人輪流往這個集合裡面增加數字,增加的這個數字的原則是:這個集合裡面任選兩個數的和或差(a + b或a - b或b -a的中的任意一個沒被選中的符合[1,n]的點 ),集合裡面的數字不能重複,同時這個數字不能大於 n ,求最後哪個人選不了滿足條件的數了。

解題思路:能被選的點其實只有n / GCD(a,b),為什麼呢,思考一下:a + b或a - b或b -a這樣的數次操作之後,無論怎樣,最後得到的這個集合裡面的數列,其實是一個等差數列,因為初始的a和b決定了塔的間距,最後只要判奇偶即可。

貼程式碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <set>
#include <sstream>
#include <stack>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int gcd(int a,int b){
    return b == 0 ? a : gcd(b,a%b);
}

int main()
{
    int t,n,a,b;
    int kase = 1;
    cin>>t;
    while(t--){
        cin>>n>>a>>b;
        int m = gcd(a,b);
        cout<<"Case #"<<kase++<<": ";
        if(n / m % 2 == 1){
            cout<<"Yuwgna"<<endl;
        }else{
            cout<<"Iaka"<<endl;
        }
    }
    return 0;
}