题目背景
下发文件:
https://luogu-ipic.oss-cn-shanghai.aliyuncs.com/watujir2-jdi92.zip
题目描述
2102 年,人类已经建立了从地球到室女座 \alphaα 星的星际通道。通道绵延数百光年。
而在通道上有许多路牌。第 ii 个路牌上写有一个分数 \dfrac{a_i}{b_i}biai 和一个分数运算符 ++ 或 -−。
一开始,你的手上拿着一个数字 00。你沿着通道向后走。每走到一个路牌,会用手上的数和路牌上的分数,用路牌上的运算符号进行计算,并把得到的新数拿在手中(丢弃掉手中原来的数)。值得注意的是,如果你手中计算得到的数不是整数,则会保留既约分数的形式;否则直接保留整数形式。
现在你想知道,当你走到通道的末端时,手中拿着的数是多少?
输入格式
第 11 行共一个正整数 nn 表示通道内共有 nn 个路牌。
第 2\sim n+12∼n+1 行每行三个正整数 a_i,b_i,opt_iai,bi,opti表示第 ii 个路牌上写着的分数为 \dfrac{a_i}{b_i}biai,运算符为 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;
}