肥美题解
2026-09-29 19:55:37
发布于:上海
/code
#include <iostream>
#include <cmath>
#include <string>
#include <utility>
using namespace std;
typedef long long ll;
ll gcd(ll n, ll m){
if(m == 0) return abs(n);
return gcd(m, n % m);
}
string convert(ll son,ll mum){
ll g = gcd(son,mum);
son /= g,mum /= g;
if (mum < 0) son = -son,mum = -mum;
if (mum == 1) return to_string(son);
else return to_string(son) + "/" + to_string(mum);
}
pair<ll,ll> simple_sqrt(ll delta){
ll k = 1,r = delta;
for(ll d = 2;d * d <= r;d ++){
while(r % (d * d) == 0) {
k *= d,r /= d * d;
}
} return {k,r};
}
string difficult_change(ll a,ll b,ll k,ll r){
ll q1_num = -b,q1_den = 2 * a;
ll q2_num,q2_den;
if (a > 0) q2_num = k,q2_den = 2 * a;
else q2_num = -k,q2_den = 2 * a;
ll g2 = gcd(q2_num,q2_den);
q2_num /= g2,q2_den /= g2;
if (q2_den < 0) q2_num = -q2_num,q2_den = -q2_den;
if (q2_num < 0){
ll new_num = q1_num * q2_den + q2_num * q1_den;
ll new_den = q1_den * q2_den;
q1_num = new_num;
q1_den = new_den;
q2_num = -q2_num;
}
ll g1 = gcd(q1_num,q1_den);
q1_num /= g1,q1_den /= g1;
if (q1_den < 0) q1_num = -q1_num,q1_den = -q1_den;
string ans;
if (!(q1_num == 0)) ans += (convert(q1_num, q1_den) + "+");
ll c = q2_num,d = q2_den;
if (c == 1 && d == 1) ans += "sqrt(" + to_string(r) + ")";
if (c > 1 && d == 1) ans += to_string(c) + "*sqrt(" + to_string(r) + ")";
if (c == 1 && d > 1) ans += "sqrt(" + to_string(r) + ")/" + to_string(d);
if (c > 1 && d > 1) ans += to_string(c) + "*sqrt(" + to_string(r) + ")/" + to_string(d);
return ans;
}
bool convert_greater(ll n1,ll d1,ll n2,ll d2){
return n1 * d2 > n2 * d1;
}
void solve(){
ll a,b,c; cin >> a >> b >> c;
ll delta = 1LL * b * b - 4LL * a * c;
if (delta < 0){
cout << "NO" << endl;
return;
}
ll s = sqrt(delta),flag = 0;
if(s * s == delta) flag = 1;
else if((s + 1) * (s + 1) == delta) s ++,flag ++;
if (flag){
ll n1 = -b + s,d1 = 2 * a,n2 = -b - s,d2 = 2 * a;
if(convert_greater(n1,d1,n2,d2)) cout << convert(n1, d1) << endl;
else cout << convert(n2, d2) << endl;
}
else{
auto x = simple_sqrt(delta);
cout << difficult_change(a,b,x.first,x.second) << endl;
}
}
int main(){
freopen ("uqe.in","r",stdin);
freopen ("uqe.out","w",stdout);
int t,useless; cin >> t >> useless;
while(t --){
solve();
}
fclose (stdin);
fclose (stdout);
return 0;
}
这里空空如也




有帮助,赞一个