洛谷 P8584 探索未知 题解

该博客介绍了一个数学问题,涉及星际通道上的分数运算。旅行者从0开始,沿途根据路牌上的分数和运算符(加或减)进行计算。问题要求计算到达通道尽头时手中的数,保证结果为既约分数。给定输入样例和输出样例,并提供了参考代码实现。
摘要由CSDN通过智能技术生成

题目背景

下发文件:

https://luogu-ipic.oss-cn-shanghai.aliyuncs.com/watujir2-jdi92.zip

题目描述

2102 年,人类已经建立了从地球到室女座 \alphaα 星的星际通道。通道绵延数百光年。

而在通道上有许多路牌。第 ii 个路牌上写有一个分数 \dfrac{a_i}{b_i}bi​ai​​ 和一个分数运算符 ++ 或 -−。

一开始,你的手上拿着一个数字 00。你沿着通道向后走。每走到一个路牌,会用手上的数和路牌上的分数,用路牌上的运算符号进行计算,并把得到的新数拿在手中(丢弃掉手中原来的数)。值得注意的是,如果你手中计算得到的数不是整数,则会保留既约分数的形式;否则直接保留整数形式。

现在你想知道,当你走到通道的末端时,手中拿着的数是多少?

输入格式

第 11 行共一个正整数 nn 表示通道内共有 nn 个路牌。

第 2\sim n+12∼n+1 行每行三个正整数 a_i,b_i,opt_iai​,bi​,opti​表示第 ii 个路牌上写着的分数为 \dfrac{a_i}{b_i}bi​ai​​,运算符为 opt_iopti​。

其中,+,-+,− 两种运算分别用 1,21,2 代替。

输出格式

共一行一个数。

若最终的结果可以保留为整数,则输出一个整数 ansans 表示结果。

否则,若最终的结果只能保留为分数,则需要以 a/ba/b 的形式输出一个分数 \dfrac{a}{b}ba​。需要保证 \dfrac{a}{b}ba​ 为既约分数,即 \gcd(a,b)=1gcd(a,b)=1 。

需要注意,结果可能出现负数,此时需要保留负号。例如,若结果为 -\dfrac{11451}{4}−411451​,那么需要输出 -11451/4

输入输出样例

输入 #1复制

3
3 5 1
4 7 2
7 3 1

输出 #1复制

248/105

输入 #2复制

4
6 7 1
8 3 2
9 14 2
5 17 1

输出 #2复制

-1541/714

输入 #3复制

3
7 4 1
3 8 2
3 8 2

输出 #3复制

1

说明/提示

对于 20\%20% 的数据,运算符只存在加法。

另有 20\%20% 的数据,运算法只存在减法。

对于 100\%100% 的数据,保证 1\leq n\leq 10^31≤n≤103,0\leq a \leq 10000≤a≤1000,0 < b \leq 10000<b≤1000,保证答案以及过程中全部数值(整数部分/分子/分母)不超过 2\times 10^92×109。

附件下载

额外样例.zip344B

参考代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
long long n,a,b,c,ans1=0,ans2=1;
int gcd(int a,int b)
{
	if(b!=0) 
		return gcd(b,a%b);
	else
		return a;
}
int gbs(int a,int b)
{
	return a/gcd(a,b)*b;
}
int main()
{
//	freopen("explore.in","r",stdin);
//	freopen("explore.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b>>c;
		long long x=gbs(ans2,b);
		long long d1=x/ans2,d2=x/b;
		if(c==1)
			ans1=ans1*d1+a*d2;
		if(c==2)
			ans1=ans1*d1-a*d2;
		ans2=x;
	}
	long long d3=gcd(ans1,ans2);
	ans1=ans1/d3;
	ans2=ans2/d3;
	if(ans1!=ans2)
	{
		if(ans2<0)
		{
			ans2=abs(ans2);
			cout<<"-"<<ans1<<"/"<<ans2;
		}
		else
			cout<<ans1<<"/"<<ans2;
	}
	else cout<<ans1;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值