CCF的神秘数据
查看原帖
CCF的神秘数据
804607
rainygame楼主2023/11/1 18:32
#include <bits/stdc++.h>
using namespace std;
#define int long long

int t, m, a, b, c, delta, val, g;
int ps[6000001];
map<int, int> mp;

struct Frac{
    int a, b;
    void get(){
        int tmp(__gcd(abs(a), b));
        a /= tmp;
        b /= tmp;
    }

    Frac(int x=1, int y=1){
        a = x;
        b = y;
        get();
    }

    void print(){
        if ((a < 0) ^ (b < 0)) cout << '-';
        if (abs(b) == 1) cout << abs(a);
        else cout << abs(a) << '/' << abs(b);
    }
};

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> t >> m;
    for (int i(0); i<=6*m; ++i) mp[i*i] = i;
    while (t--){
        cin >> a >> b >> c;
        delta = b*b-((a*c)<<2);
        if (delta < 0){
            cout << "NO\n";
            continue;
        }

        // cout << (3600-4*(-5)*320) << '\n';
        // cout << delta << '\n';
        a <<= 1;
        if (a > 0){
            if (mp.count(delta)){
                Frac(mp[delta]-b, a).print();
                cout << '\n';
                continue;
            }

            g = 1;
            for (int i(2); i*i<delta; ++i){
                if (delta % i == 0){
                    int cnt(0);
                    while (delta % i == 0){
                        delta /= i;
                        ++cnt;
                        if (cnt == 2){
                            g *= i;
                            cnt = 0;
                            // cout << "g:" << i << '\n';
                        }
                    }
                    if (cnt) delta *= i;
                }
            }

            // cout << "d:" << delta << '\n';
            if (b){
                Frac(-b, a).print();
                cout << '+';
            }

            int tmp(__gcd(g, abs(a)));
            g /= tmp;
            a /= tmp;
            if (g > 1) cout << g << '*';
            cout << "sqrt(" << delta << ')';
            if (a > 1) cout << '/' << a;
            cout << '\n';
        }else{
            if (mp.count(delta)){
                Frac(-b-mp[delta], a).print();
                cout << '\n';
                continue;
            }

            g = 1;
            for (int i(2); i*i<delta; ++i){
                if (delta % i == 0){
                    int cnt(0);
                    while (delta % i == 0){
                        delta /= i;
                        ++cnt;
                        if (cnt == 2){
                            g *= i;
                            cnt = 0;
                        }
                    }
                    if (cnt) delta *= i;
                }
            }

            // cout << "d:" << delta << '\n';
            // cout << g << '\n';
            if (b){
                Frac(-b, a).print();
                cout << '+';
            }

            a = -a;
            int tmp(__gcd(g, a));
            g /= tmp;
            a /= tmp;
            if (g > 1) cout << g << '*';
            cout << "sqrt(" << delta << ')';
            if (a > 1) cout << '/' << a;
            cout << '\n';
        }
        
    }

    return 0;
}

不能过大样例,过了。

2023/11/1 18:32
加载中...