【ZOJ 1003】 Crashing Balloon

8 篇文章 0 订阅
7 篇文章 0 订阅

Description

某个6.1儿童节,nc和zxl参加了一场踩气球的游戏,规则如下: 
一共有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
****************************************************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值