60pts求调悬2关
查看原帖
60pts求调悬2关
701460
Magus楼主2024/5/27 17:01
#include<bits/stdc++.h>
#define int long long
#define gcd __gcd
using namespace std;
const int maxn=1e7+10;
int t,n,a,b,c,x,y,z,ans;
void output(int n,int m)
{
    int g=abs(gcd(n,m));
    n/=g;
	m/=g;
    if(m==1)
    {
    	cout<<n;
	}
    else
    {
    	cout<<n<<"/"<<m;
	}
}
void simplify()
{
	bool d=(y<0?1:0);
	if(d)
	{
		y*=-1;
	}
	int e=abs(gcd(y,z));
	y/=e;z/=e;
	if(d)
	{
		y*=-1;
	}
}
signed main()
{
	cin>>t>>n;
	while(t--)
	{
		cin>>a>>b>>c;
		if(a<0)
		{
			a=-a;b=-b;c=-c;
		}
		int delta=b*b-4*a*c;
		if(delta<0)
		{
			cout<<"NO";
		}
		else if(delta==0)
		{
			output(-b,2*a);
		}
		else
		{
			if((long long)sqrt(delta)*(long long)sqrt(delta)==delta)
			{
				if(a<0)
				{
					output(-b-sqrt(delta),2*a);	
				}
				else
				{
					output(-b+sqrt(delta),2*a);	
				}
			}
			else
			{
				if(b!=0)
				{
					output(-b,2*a);
					cout<<"+";
				}
				if(a<0)
				{
					a=-a;
				}
				for(int i=sqrt(delta);i>=1;i--)
				{
					if(delta%(i*i)==0)
					{
						x=i;
						break;
					}
				}
				delta/=x*x;
				int m;
				m=abs(gcd(m,2*a));
				y=x/m;
				z=2*a/m;
				simplify();
				if(z==1)
				{
					if(y==1)
					{
						cout<<"sqrt("<<delta<<")";
					}
					else
					{
						cout<<y<<"*sqrt("<<delta<<")";
					}
				}
				else if(y==1)
				{
					cout<<"sqrt("<<delta<<")/"<<z;
				}
				else
				{
					cout<<y<<"*sqrt("<<delta<<")/"<<z;
				}
			}
		}
		cout<<endl;
	}
	return 0;
}
2024/5/27 17:01
加载中...