1 条题解

  • 0
    @ 2025-8-24 22:40:24

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar scp020
    这是一个亖人 || 最后在线时间:2025年8月24日9时5分

    搬运于2025-08-24 22:40:24,当前版本为作者最后更新于2022-10-19 21:16:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目大意

    给定 nn 个分数 aibi\dfrac{a_i}{b_i},并且给出 optiopt_i,当 optiopt_i11 时表示在总数上加上 aibi\dfrac{a_i}{b_i},当 optiopt_i22 时表示在总数上减去 aibi\dfrac{a_i}{b_i},求最后的总和。

    解决

    本题模拟即可。

    对于两个分数 x1y1\dfrac{x_1}{y_1}x2y2\dfrac{x_2}{y_2} 相加,我们可以通分,即 x1×y2y1×y2\dfrac{x_1 \times y_2}{y_1 \times y_2}x2×y1y2×y1\dfrac{x_2 \times y_1}{y_2 \times y_1} 相加,结果为 $\dfrac{x_1 \times y_2 + x_2 \times y_1}{y_1 \times y_2}$。

    对于两个分数 x1y1\dfrac{x_1}{y_1}x2y2\dfrac{x_2}{y_2} 相减,同上,即 x1×y2y1×y2\dfrac{x_1 \times y_2}{y_1 \times y_2}x2×y1y2×y1\dfrac{x_2 \times y_1}{y_2 \times y_1} 相减,结果为 $\dfrac{x_1 \times y_2 - x_2 \times y_1}{y_1 \times y_2}$。

    除了以上大致解法,我们还要考虑一些特殊情况,例如 63\dfrac{6}{3} 这种可以约分的,还有 65\dfrac{-6}{-5}65\dfrac{6}{-5} 这种负号有误的,都需要想到。

    赛时代码

    #include<bits/stdc++.h>
    using namespace std;
    namespace IO//感谢出题人给的快读模板
    {
    	char ibuf[(1<<20)+1],*iS,*iT;
    	#if ONLINE_JUDGE
    	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
     	#else
    	#define gh() getchar()
    	#endif
    	#define reg register
    	inline long long read()
    	{
    		reg char ch=gh();
    		reg long long x=0;
    		reg char t=0;
    		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
    		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
    		return t?-x:x;
    	}
    }
    using IO::read;
    inline long long gcd(long long m,long long n)
    {
        return n?gcd(n,m%n):m;
    }
    long long n,a,b,ra,rb,GCD,op;//a为分子,b为分母
    int main()
    {
    	n=read(),ra=read(),rb=read(),op=read(),n--;
    	if(op==2) ra=-1*ra;
    	while(n--)
    	{
    		a=read(),b=read(),op=read();
    		if(op==1) ra=ra*b+rb*a,rb=rb*b;
    		else ra=ra*b-rb*a,rb=rb*b;
    		GCD=gcd(ra,rb),ra/=GCD,rb/=GCD;
    	}
    	if(ra*rb<0) ra=-1*abs(ra),rb=abs(rb);
    	if(ra<0 && rb<0) ra=abs(ra),rb=abs(rb);
    	if(ra%rb==0) printf("%lld",ra/rb);
    	else printf("%lld/%lld",ra,rb);
    	return 0;
    }
    
    • 1

    信息

    ID
    8105
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者