列表

详情


NC21363. 数论只会GCD

描述

小西买了一堆肥宅快乐水和肥宅快乐茶,准备和室友比谁更肥宅。
快乐水有A瓶,快乐茶B瓶。
小西和室友的规则是这样的:
1. 小西先手,轮流到每个人的回合,每个回合只能喝剩余数量较多的饮料
2. 满足规则1的同时,每次只能喝另一种饮料剩余数量的正整数倍
3. 满足1、2的同时,不能超额喝饮料,也就是说剩下2瓶的时候不能喝大于2瓶的数量。
4. 每个人在自己的回合如果能喝完剩下的其中一种饮料,那么就获得胜利。
例如A=10,B=2。
小西只能喝快乐水,且只能喝2/4/6/8/10瓶快乐水。小西可以喝10瓶快乐水直接获得胜利。

小西和室友都是肥宅,所以他们都会才采取为了胜利最优的行动。
现在请你判断小西是否能赢得胜利。

输入描述

第一行输入一个整数T,表示有T组数据
接下来T行,每行为一组数据,每行有两个正整数表示A和B的初始数量


输出描述

对于每组数据,若小西可以获得胜利则输出一行“wula”,否则输出一行“mmp”,不需要输出引号

示例1

输入:

2
20 18
10 4

输出:

mmp
wula

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 51ms, 内存消耗: 4544K, 提交时间: 2023-01-26 19:10:49

t = int(input().strip())

for i in range(t):
    a,b = input().split(' ')
    a,b = int(a), int(b)
    if a < b:
        a, b = b, a
    ans = 0
    while b != 0:
        if a // b >= 2 or a % b == 0:
            break
        a,b = b, a % b
        ans += 1
    print('mmp' if ans % 2 != 0 else 'wula')

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2018-11-25 15:22:21

#include<bits/stdc++.h>
using namespace std;
long long i,i0,n,m,T;
int main()
{
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld %lld",&n,&m);
        if(n>m)swap(n,m);
        if(n==m||n<m-m/(1+(1+sqrt(5))/2))printf("wula\n");
        else printf("mmp\n");
    }
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 496K, 提交时间: 2020-01-15 15:37:17

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		double a,b;
		cin>>a>>b;
		if(b>a)
		{//改成a大b小
			double t = a;
			a=b;
			b=t;
		}
		if(a/b>(sqrt(5)+1)/2) cout<<"wula"<<endl;
		else cout<<"mmp"<<endl;;
	}
	return 0;
}

上一题