社区讨论

T3求救!!!

灌水区参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lnzunx6h
此快照首次捕获于
2023/10/21 17:41
2 年前
此快照最后确认于
2023/11/02 12:13
2 年前
查看原帖
CPP
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int delta(int a,int b,int c){
    return b*b-4*a*c;
}
int gcd(int a,int b){
    return __gcd(a,b);
}
bool check(int delta){
    if(pow(int(sqrt(delta)),2)==delta){
        return true;
    }
    else{
        return false;
    }
}
void UQE(int a,int b,int c,int delta){
    if(check(delta)){
        int up1=-b+sqrt(delta);
        int up2=-b-sqrt(delta);
        int up=max(up1,up2);
        int down=2*a;
        if(up<0&&down>0){
            cout<<"-";
            up=-up;
        }
        if(down<0&&up>0){
            cout<<"-";
            down=-down;
        }
        if(up<0&&down<0){
            up=-up;
            down=-down;
        }
        if(up==0){
            cout<<0<<endl;
            return;
        }
        int k=gcd(up,down);
        up/=k;
        down/=k;
        if(down==1){
            cout<<up<<endl;
            return;
        }
        cout<<up<<"/"<<down<<endl;
        return;
    }
    else{
        int up=-b;
        int down=2*a;
        int down1=down;
        if(up<0&&a>0){
            cout<<"-";
            up=-up;
        }
        if(a<0&&up>0){
            cout<<"-";
            down=-down;
        }
        if(a<0&&up<0){
            up=-up;
            down=-down;
        }
        if(up!=0){
            int k=gcd(up,down);
            up/=k;
            down/=k;
            if(down==1){
                cout<<up;
                if(a>0){
                    cout<<"+";
                }
            }
            else{
                cout<<up<<"/"<<down;
                if(a>0){
                    cout<<"+";
                }
            }
        }
        int q2;
        for(int i=1;i*i<=delta;i++){
            if(delta%(i*i)==0){
                q2=i;
            }
        }
        // cerr<<"q2="<<q2<<endl;
        int r=delta/(q2*q2);
        int k1=gcd(q2,down1);
        q2/=k1;
        down1/=k1;
        if(q2==1&&down1==1){
            printf("sqrt(%d)\n",r);
            return;
        }
        else if(q2==1&&down1!=1){
            printf("sqrt(%d)/%d\n",r,down1);
        }
        else if(down1==1){
            printf("%d*sqrt(%d)\n",q2,r);
            return;
        }
        else{
            printf("%d*sqrt(%d)/%d\n",q2,r,down1);
            return;
        }
    }
}
int main(){
    int t,m;
    cin>>t>>m;
    while(t--){
        int a,b,c;
        cin>>a>>b>>c;
        if(delta(a,b,c)<0){
            cout<<"NO"<<endl;
        }
        else{
            UQE(a,b,c,delta(a,b,c));
        }
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...