Bootstrap

Cantor表(升级版)

Cantor表(升级版)

题目描述

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

1 / 1 1 / 2 1 / 3 1 / 4 1 / 5 ⋯ 2 / 1 2 / 2 2 / 3 2 / 4 ⋯ 3 / 1 3 / 2 3 / 3 ⋯ 4 / 1 4 / 2 ⋯ 5 / 1 ⋯ \begin{matrix} 1/1 & 1/2 & 1/3 & 1/4 & 1/5 & \cdots \cr 2/1 & 2/2 & 2/3 & 2/4 & \cdots \cr 3/1 & 3/2 & 3/3 & \cdots \cr 4/1 & 4/2 & \cdots \cr 5/1 & \cdots \cr \end{matrix} 1/12/13/14/15/11/22/23/24/21/32/33/31/42/41/5

这次与 NOIp1999 第一题不同的是:这次需输入两个分数(不一定是最简分数),算出这两个分数的积(注意需要约分至最简分数),输出积在原表的第几列第几行(若积形如 a a a(即结果为整数)或者 1 / a 1/a 1/a,则看作表内的 a / 1 a/1 a/1 1 / a 1/a 1/a 结算)。

输入格式

共两行。每行输入一个分数(不一定是最简分数)。

输出格式

两个整数,表示输入的两个分数的积在表中的第几列第几行。

样例 #1

样例输入 #1

4/5
5/4

样例输出 #1

1 1

提示说明

数据范围

对于全部数据,两个分数的分母和分子均小于 1 0 4 10^4 104

代码内容

// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

//辗转相除法求最大公约数
ll gcd(ll a,ll b)
{
    if (!b)return a;
    else return gcd(b,a%b);
}

int main()
{
    ll a,b,c,d,t;
    char hh;
    cin>>a>>hh>>b>>c>>hh>>d;
    
    a*=c;b*=d;
    t=gcd(a,b);//求最大公约数
    a/=t,b/=t;//约分

    cout<<b<<" "<<a<<endl;
    return 0;
}
;