真题_CSP2023-J第二轮 一元二次方程

这题难度4颗半星欧,但是在本小姐的帮助下你肯定会做哒——甜甜

还有,我谈恋爱啦!封面就是呦!分享给我的铁粉

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c;
ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}
void solve()
{
    cin>>a>>b>>c;
    ll san=b*b-4*a*c;
    if(san<0)cout<<"NO\n";
    else if(san==0||san==(int)(sqrt(san))*(int)(sqrt(san)))//可去根号--有理数
    {
        ll shang=-b+(a<0?-(int)(sqrt(san)):(int)(sqrt(san))),xia=2*a;
        if(shang==0)//结果是0
        {
            cout<<"0\n";
        }
        else//有理数
        {
            ll g=gcd(abs(shang),abs(xia));
            shang/=g;
            xia/=g;
            int f=0;
            f+=shang>=0;
            f+=xia>=0;
            if(f==1)//结果是负数
            {
                if(abs(xia)==1)cout<<"-"<<abs(shang)<<"\n";
                else cout<<"-"<<abs(shang)<<"/"<<abs(xia)<<"\n";
            }
            else  //结果是正数
            {
                if(abs(xia)==1)cout<<abs(shang)<<"\n";
                else cout<<abs(shang)<<"/"<<abs(xia)<<"\n";
            }
        }
    }
    else  //无理数
    {
        //先输出q1 ,a此时一定不是0
        if(b==0)
        {
            //            cout<<"\n";
            //不输出
        }
        else
        {
            ll shang1=-b,xia1=a*2;
            ll g=gcd(abs(shang1),abs(xia1));
            shang1/=g;
            xia1/=g;
            int f=0;
            f+=shang1>=0;
            f+=xia1>=0;
            if(f==1)//结果是负数
            {
                if(abs(xia1)==1)cout<<"-"<<abs(shang1);
                else cout<<"-"<<abs(shang1)<<"/"<<abs(xia1);
            }
            else  //结果是正数
            {
                if(abs(xia1)==1)cout<<abs(shang1);
                else cout<<abs(shang1)<<"/"<<abs(xia1);
            }
        }
        //再输出q2*sqrt(r)
        {
            ll shang1=1,xia1=a*2,r=san;
            for(int i=2; i*i<=r; i++)
            {
                while(r%(i*i)==0)
                {
                    shang1*=i;
                    r/=i*i;
                }
            }
            ll g=gcd(abs(shang1),abs(xia1));
            shang1/=g;
            xia1/=g;
            if(b!=0)cout<<"+";
            if(abs(shang1)!=1)
            {
                cout<<abs(shang1);
                if(abs(xia1)==1)cout<<"*sqrt("<<r<<")";
                else cout<<"*sqrt("<<r<<")/"<<abs(xia1);
            }
            else
            {
                if(abs(xia1)==1)cout<<"sqrt("<<r<<")";
                else cout<<"sqrt("<<r<<")/"<<abs(xia1);
            }
            cout<<"\n";
        }
    }
}
int main()
{
//     freopen("uqe.in", "r", stdin);
//     freopen("uqe.out", "w", stdout);
    int t,m;
    cin>>t>>m;
    while(t--)solve();
    return 0;
}
//3272

题目描述


 


 

输入

输入的第一行包含两个正整数 T, M,分别表示方程数和系数绝对值的上界;
接下来 T 行,每行包含三个整数a, b, c。
 

输出

输出 T 行,每行包含一个字符串,表示对应询问的答案,格式如题面所述。
每行输出的字符串中间不应包含任何空格。

样例输入
9 1000
1 -1 0
-1 -1 -1
1 -2 1
1 5 4
4 4 1
1 0 -432
1 -3 1
2 -4 1
1 7 1

样例输出
1
NO
1
-1
-1/2
12*sqrt(3)
3/2+sqrt(5)/2
1+sqrt(2)/2
-7/2+3*sqrt(5)/2
  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值