j t3 代码求调教
  • 板块学术版
  • 楼主Lovely_Elaina
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/29 20:49
  • 上次更新2023/11/2 10:47:06
查看原帖
j t3 代码求调教
781159
Lovely_Elaina楼主2023/10/29 20:49
#include <bits/stdc++.h>
using namespace std;

// luogu : wind_kaka

int t,m;
int a,b,c;
int w,n,d,k;

map<int,int > ma;

inline int gcd(int x,int y){
	if(y == 0) return x;
	return gcd(y,x%y);
}

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

	// freopen("uqe1.in",) ha ha
	
    
    for(int i = 0; i*i <= 1000; i++){
    	ma[i*i] = i;
	}
    
    cin >> t >> m;
    while(t--){
    	cin >> a >> b >> c;
    	if(b*b-4*a*c < 0){
    		cout << "NO\n";
    		continue;
		}
		
		
		// w/n + sqrt(d)/k
		w = -b;
		n = 2*a;
		d = b*b-4*a*c;
		k = 2*a;
		
		int qwq = 1;
		
		int a1,a2;
		a1 = a2 = 1;
		
		if(d == 0){
			if(w == 0){
				cout << 0 << '\n';
			}else{
				if(w < 0){
					w *= -1;
					a1 *= -1;
				}
				if(n < 0){
					n *= -1;
					a1 *= -1;
				}
				int p = gcd(w,n);
				w /= p;
				n /= p;
				if(n == 1){
					cout << a1*w << '\n';
				}else{
					cout << a1*w << '/' << n << '\n';
				}
			}
			continue;
		}
		
		bool sq = 1;
		
		if(w < 0){
			w *= -1;
			a1 *= -1;
		}
		if(n < 0){
			n *= -1;
			a1 *= -1;
		}
		if(k < 0){
			k *= -1;
			a2 = 1;
		}
		
		if(ma.find(abs(d)) != ma.end()){
			d = ma[abs(d)];
			sq = false;
		}
		
		//cout << gcd(w,n) << endl;
		int p = gcd(w,n);
		w /= p;
		n /= p;
		
		if(!sq){
			p = gcd(d,k);
			d /= p;
			k /= p;
			
			if(n == 1 && k == 1){
				cout << a1*w + d << '\n';
			}else if(n == 1){
				cout << a1*w*k + d << '/' << k << '\n';
			}else if(k == 1){
				cout << a1*w + d*n << '/' << n << '\n';
			}else{
				// cout << a1*w << '/' << n;
				// cout << a2*d << '/' << k << '\n';
				w *= k;
				d *= n;
				
				n *= k;
				
				w = a1*w+d;
				p = gcd(w,n);
				w /= p;
				n /= p;
				if(n != 1) cout << w << '/' << n << '\n';
				else cout << w << '\n';
			}
		}else{
			if(w != 0){
				if(n != 1) cout << a1*w << '/' << n;
				else cout << a1*w;
			}
			
			if(w != 0) cout << '+';
			
			for(int i = floor(sqrt(d*1.0)); i > 1; i--){
				if(d % (i*i) == 0){
					d /= (i*i);
					qwq *= i;
				}
			}
			
			p = gcd(qwq,k);
			qwq /= p;
			k /= p;
			
			if(qwq == 1){
				cout << "sqrt(" << d << ")";
			}else{
				cout << qwq << "*sqrt(" << d << ")";
			}
			if(k != 1){
				cout << '/' << k << '\n';
			}else cout << '\n';
		}
	}
    
    return 0;
}
2023/10/29 20:49
加载中...