题面。
直接依照题意模拟即可,注意细节。
细节
第一
注意输出分式时分母为 \(1\) 不输出,分子为 \(0\) 直接输出零且不带正负号。
第二
约分时,\(gcd\) 内的两个数应该都是非负实数。
第三
可以单独输出符号,注意别有多余的符号。
第四
当方程有两根且均是有理数时,要根据 \(2a\) 的正负来判断哪个根最大:当 \(2a>0\) 时,最大的根为 \(\displaystyle \frac{-b+\sqrt{\Delta}}{2a}\),否则应该是 \(\displaystyle \frac{-b-\sqrt{\Delta}}{2a}\)。
第五
注意一下自己的符号有没有打对!!!!(无理数部分符号打错了还能有七十分真是奇迹)
第六
全输出 \(\text{NO}\) 一分没有(不要想着水分)。
代码
#include<bits/stdc++.h>
#define ll long long
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
using namespace std;
inline ll gcd(ll a , ll b)
{
return b == 0 ? a : gcd(b , a % b);
}
inline ll derta(ll a , ll b , ll c)
{
return b * b - 4 * a * c;
}
ll T , M , a , b , c;
signed main()
{
// freopen("data.in" , "r" , stdin);
// freopen("data.out" , "w" , stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T >> M;
while(T--)
{
cin >> a >> b >> c;
if(derta(a , b , c) < 0)//判别式小于零,无解
{
cout << "NO" << '\n';
continue;
}
else if(derta(a , b , c) == 0)//两个有理数根
{
if(b == 0)
{
cout << 0 << '\n';
continue;
}
else
{
ll ccf = gcd(abs(2 * a) , (abs(-b)));
if(-b * a < 0)
{
cout << "-";
}
cout << abs(-b) / ccf;
if(abs(2 * a) / ccf != 1)
{
cout << "/" << abs(2 * a) / ccf << '\n';
}
else
{
cout << '\n';
}
}
}
else
{
//x1 = (-b - sqrt(derta(a , b , c))) / (2 * a);
//x2 = (-b + sqrt(derta(a , b , c))) / (2 * a);
ll dt = derta(a , b , c);
ll ccf = gcd(abs(a) , abs(b));
double sqdt = sqrt(dt);
if(sqdt - (ll)sqrt(dt) == 0.0)//有理数
{
dt = sqrt(dt);
ll flag;
if(2 * a > 0)
{
flag = 1;
}
else
{
flag = -1;
}
ccf = gcd(abs(-b + dt * flag) , abs(2 * a));
if((-b + dt * flag) * a < 0)
{
cout << "-";
}
cout << abs(-b + dt * flag) / ccf;
if(abs(2 * a) / ccf != 1)
{
cout << "/" << abs(2 * a) / ccf << '\n';
}
else
{
cout << '\n';
}
}
else//无理数
{
//有理数部分
ccf = gcd(abs(-b) , abs(2 * a));
if(b != 0)
{
if(-b * a < 0)
{
cout << "-";
}
cout << abs(-b) / ccf;
if(abs(2 * a) / ccf != 1)
{
cout << "/" << abs(2 * a) / ccf;
}
}
//无理数部分
ll cf = dt , w_fz = dt , q2 = 1;
fo(i , sqrt(M * M * 4) , 1)
{
if(cf % (i * i) == 0)
{
cf /= i * i;
w_fz /= i * i;
q2 = i;
break;
}
}
ccf = gcd(q2 , abs(2 * a));
if(a < 0 && b != 0)
{
cout << "+";
}
else
{
if(b != 0 && q2 != 0)
{
cout << "+";
}
}
if(q2 / ccf != 1)
{
cout << q2 / ccf << "*";
}
if(w_fz != 1)
{
cout << "sqrt(" << w_fz << ")";
}
if(abs(2 * a) / ccf != 1)
{
cout << "/" << abs(2 * a) / ccf << '\n';
}
else
{
cout << '\n';
}
}
}
}
return 0;
}
标签:gcd,题解,ll,cin,flag,一元二次方程,2a,CSP,cout
From: https://www.cnblogs.com/xhqdmmz/p/18126536