「IXOI R1」出题人完全不会给题目起名字 题解

P15444 「IXOI R1」出题人完全不会给题目起名字

题目背景

这是空银子,她非常可爱。

现在她给了你一道题,如果你能做出来,就可以和你约会。

这正是你一直想要的,而这道题肯定难不到你啦。

题目描述

给定一个长度为 n n n正有理数序列 a i ( i ∈ [ 1 , n ] ) a_i(i\in[1,n]) ai(i[1,n]),定义一次操作为:

选取一个下标 j j j,然后 ∀ i ∈ [ 1 , n ] \forall i\in[1,n] i[1,n],令 a i ← a i a j a_i\gets \frac{a_i}{a_j} aiajai

现在空银子想问你,在经过任意次操作之后,序列中的最小值最小能是多少。

输入格式

第一行一个正整数 n n n,表示序列长度。

接下来 n n n 行,第 i + 1 i+1 i+1 行两个正整数 x i , y i x_i,y_i xi,yi,表示 a i = x i y i a_i=\frac{x_i}{y_i} ai=yixi

输出格式

输出一行两个正整数 x , y x,y x,y,表示最小值是 x y \frac{x}{y} yx

请注意,你输出的分数必须要是最简分数,特别的,若最终结果化简后是一个整数,则输出的 y y y 1 1 1

输入输出样例 #1

输入 #1

5
4 3
22 8
3 99
4 3
17 43

输出 #1

4 363

说明/提示

样例解释

一共进行 4 4 4 次操作,分别选取下标为 5 , 4 , 1 , 2 5,4,1,2 5,4,1,2,可以得到序列中最小值 4 363 \frac{4}{363} 3634,可以证明不存在更小的答案。

数据范围

本题采用捆绑测试。

子任务编号 n ≤ n\le n分值
0 0 0 10 10 10 20 20 20
1 1 1 5000 5000 5000 20 20 20
2 2 2 10 6 10^6 106 60 60 60

对于所有数据,保证:

2 ≤ n ≤ 10 6 2\le n\le 10^6 2n106 ∀ i ∈ [ 1 , n ] , 0 < x i , y i ≤ 10 9 \forall i\in[1,n],0<x_i,y_i\le 10^9 i[1,n],0<xi,yi109

思路

直接写即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,uv=0,xx=1,yy=1;
struct one{
    long long x,y;
}a[1000006];
bool cmp(one a1,one b1){
    return a1.x*b1.y<b1.x*a1.y;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
        uv=__gcd(a[i].x,a[i].y);
        a[i].x/=uv;
        a[i].y/=uv;
    }
    sort(a+1,a+n+1,cmp);
    xx=a[1].x*a[n].y;
    yy=a[1].y*a[n].x;
    uv=__gcd(xx,yy);
    xx/=uv;
    yy/=uv;
    cout<<xx<<" "<<yy<<endl;
	return 0;
} 

posted @ 2026-03-02 16:48  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源