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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值