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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章