Pagodas UVALive 7241

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座佛塔,經過時間的沖刷,現在只剩下兩座佛塔矗立(其餘佛塔都塌了),現在你能重建這n-2座佛塔,使之矗立,但是要遵守一個規則:重建佛塔的編號是當前矗立佛塔中兩個佛塔的編號差或和。

分析

首先,有a,b,以及建造規則,能不能推算出最終會建造的佛塔的所有編號。
若知道了這個,結果就出來了。
那我們將問題簡轉化爲這個問題:

已知有集合s含有元素a,b, 即s{a,b}。每次能從集合s中選出兩個元素x,y,可利用這兩個元素生成c=|x-y| 或 d=x+y,如果元素編號在1~n內,就將其生成的元素加入到集合s中去;否則,運算停止。
問:由於每次運算有多種選擇,可能導致最終集合裏的元素會不同。那麼是這樣嗎?

測試發現,已知n,a,b,那麼是可以確定集合s中所有的元素的。

例如:
12 6 8
在這裏插入圖片描述

代碼

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;

int GCD(int a, int b){
    return b==0?a:GCD(b,a%b);
}

int main()
{
    ios::sync_with_stdio(0);

    int T,z=1;
    cin>>T;
    while(T--)
    {
        int ans,a,b,d,n,m;
        cin>>b>>n>>m;
        if(n > m)
            swap(n,m);
        d=GCD(n,m);
        if(n % d == 0)
            a = d;
        else
            a = n % d;
        ans = (b - a) / d + 1;
        cout<<"Case #"<<z++<<": ";
        if(ans % 2 == 0)
            cout<<"Iaka"<<endl;
        else
            cout<<"Yuwgna"<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章