Description
某个6.1儿童节,nc和zxl参加了一场踩气球的游戏,规则如下:
一共有99个气球,标号为2~99,nc和zxl去踩气球,每踩爆一个好的气球,踩的人就拿自己目前的分值乘以气球的标号(初始分值为 1),一定时间后,所有气球都会消失,然后nc和zxl都会上报自己最后的分数,这时候有你来判断胜负。为什么要判断呢,因为他俩的数学不太好,会出现算 错的情况,然后你就要根据以下规则判断了:
如果能判断低分的自己本身算错了,就判高分的赢(无论高分的是否算错); 如果高分算错了且低分的没算错,就是低分的赢。如果两人都没有算错,但是两人的目标分数都必须要踩同一个气球才能得到,就算低分的赢;如果都没有算错而且 目标分数不冲突就是高分的赢。(所谓算错就是说无法由2-100的若干数相乘得到)
一共有99个气球,标号为2~99,nc和zxl去踩气球,每踩爆一个好的气球,踩的人就拿自己目前的分值乘以气球的标号(初始分值为 1),一定时间后,所有气球都会消失,然后nc和zxl都会上报自己最后的分数,这时候有你来判断胜负。为什么要判断呢,因为他俩的数学不太好,会出现算 错的情况,然后你就要根据以下规则判断了:
如果能判断低分的自己本身算错了,就判高分的赢(无论高分的是否算错); 如果高分算错了且低分的没算错,就是低分的赢。如果两人都没有算错,但是两人的目标分数都必须要踩同一个气球才能得到,就算低分的赢;如果都没有算错而且 目标分数不冲突就是高分的赢。(所谓算错就是说无法由2-100的若干数相乘得到)
Input
多组数据,每组数据一行,两个数。
Output
每组输入数据输出赢的人的分数。
Sample Input
3
349 49
3599 610
62 36
Sample Output
49
610
62
HINT
Source
大致分析:若分数不在1~100,进行 因子分解;判断二者是否有公因数,有,则低分者为赢;否则高分赢。
注意:气球一共100个,若因子〉100,一定假。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iostream>
using namespace std;
int max1(int a, int b) {
return a > b ? a : b;
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int at,bt;
void f(int n,int m,int p)
{
if(n==1&&m==1)
{
at=1;
return;
}
if(m==1)bt=1;
while(p>1)
{
if(n%p==0)f(n/p,m,p-1);
if(m%p==0)f(n,m/p,p-1);
p--;
}
}
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int T;
int a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&a,&b);
if(a<b)
{
int t=a;
a=b;
b=t;
}
at=bt=0;
f(a,b,100);
if(bt&&!at)printf("%d\n",b);
else printf("%d\n",a);
}
return 0;
}
/**************************************************************
Problem: 1254
User: xrq
Language: C++
Result: Accepted
Time:92 ms
Memory:1532 kb
****************************************************************/