问题描述
LMY与LYM在玩一个数字游戏,一开始黑板上写有两个整数n,m。LMY先手,LMY和LYM轮流操作,每人都可以将当前的n加上n的一个正因数d,变成n+d,第一个将n变成一个大于m的数的人输掉比赛。现在给出两个数n,m;LMY和LYM都非常聪明,问谁会获胜?
输入格式
有多组测试数据:
第一行一个整数T,表示有T组数据。
第二行到第T+1行,每行两个整数,分别表示n,m。
输出格式
输出T行,若LMY赢,输出“LMY beats LYM”; 若LYM赢,输出“LYM beats LMY”;
样例输入
1
2 3
样例输出
LMY beats LYM
数据范围
30%数据: T<10; n<10;m<100;
100%数据:T<=213;n<=231-1, n
心塞到无法呼吸
写这道题题解完全是为了改悔!
在考试的时候其实第一次是想对了正解的但是最后5分钟的时候脑壳打铁换成了O(N)的爆炸算法
完全是个智障!很想骂自己!
闲话不多说,分析如下:
我们可以知道在n==m-1的时候先手是必赢的局面。而题目中已经说了m必定是个奇数。
一个很好想的性质:奇数的因数必定是一个奇数,偶数的因数必定是一个偶数。
所以当n==m-2的时候,一定是先手必输的局面,因为后手很聪明!可以加1!
1!!!!特殊的数字!!!!
所以说以此类推,当n==m-3的时候,一定是先手必赢。
看到这里你就应该明白了
这题明摆着就是个判断一下n的奇偶就ok
可是为什么我最后却把想出来的正解改了呢
因为我想错了一组样例,还是太智障了
唉,改悔!
#include<iostream>
using namespace std;
int main()
{
long long n,m,t;
cin>>t;
while(t--)
{
cin>>n>>m;
if(n%2==0)cout<<"LMY beats LYM"<<endl;
else cout<<"LYM beats LMY"<<endl;
}
}