60pts求hack,已通过讨论区所有hack数据
查看原帖
60pts求hack,已通过讨论区所有hack数据
1173402
yfhshtk楼主2024/7/14 16:38

My code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int t,m,a,b,c,val;
vector<int> sq;
bool flag;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
void search(int dlt){
	int l=-1,r=sq.size();
	flag=0;
	while(l+1!=r){
		int mid=(l+r)>>1;
		if(sq[mid]<dlt){
			l=mid;
		}
		else{
			r=mid;
		}
	}
	if(sq[r]==dlt){
		flag=1;
		val=r;
	}
	return ;
}
void Cout(int p,int q){
	if(p==0){
		cout<<0;
		return ;
	}
	int a=labs(p),b=labs(q);
	if(gcd(a,b)==b){
		cout<<p/q;
		return ;
	}
	else{
		while(gcd(a,b)!=1){
			int tmp=gcd(a,b);
			a/=tmp,b/=tmp;
		}
		if((p>0&&q<0)||(p<0&&q>0)){
			a=-a;
		}
		cout<<a<<"/"<<b;
	}
	return ;
}
void CCout(bool op,int dlt,int a,int b){
	bool pd=0;
	if(b!=0){
		pd=1;
		Cout(-b,2*a);
	}
	int k=1;
	for(int i=0;i<sq.size()&&sq[i]<=dlt;i++){
		if(gcd(sq[i],dlt)==sq[i]){
			k*=i;
			dlt/=sq[i];
		}
	}
	int p=labs(k),q=labs(2*a);
	if(gcd(p,q)==q){
		if(k/(2*a)==-1){
			if(op){
				cout<<"-sqrt("<<dlt<<')'<<endl;
			}
			else{
				if(pd){
					cout<<"+sqrt("<<dlt<<')'<<endl;
				}
				else{
					cout<<"sqrt("<<dlt<<')'<<endl;
				}
			}
			return ;
		}
		else if(k/(2*a)==1){
			if(op){
				if(pd){
					cout<<"+sqrt("<<dlt<<')'<<endl;
				}
				else{
					cout<<"sqrt("<<dlt<<')'<<endl;
				}
			}
			else{
				cout<<"-sqrt("<<dlt<<')'<<endl;
			}
			return ;
		}
		else{
			int tmp=k/(2*a);
			if(tmp>0){
				if(op){
					if(pd){
						cout<<'+';
					}
				}
				else{
					cout<<'-';
				}
			}
			else{
				if(!op){
					tmp=-tmp;
					if(pd){
						cout<<'+';
					}
				}
			}
			cout<<tmp<<"*sqrt("<<dlt<<')'<<endl;
			return ;
		}
	}
	else{
		while(gcd(p,q)!=1){
			int j=gcd(p,q);
			p/=j,q/=j;
		}
		if(2*a<0){
			k=-k;
			a=-a;
		}
		if(p==1&&k>0){
			if(op){
				if(pd){
					cout<<"+sqrt("<<dlt<<")/"<<q<<endl;
				}
				else{
					cout<<"sqrt("<<dlt<<")/"<<q<<endl;
				}
			}
			else{
				cout<<"-sqrt("<<dlt<<")/"<<q<<endl;
			}
		}
		else if(p==1&&k<0){
			if(op){
				cout<<"-sqrt("<<dlt<<")/"<<q<<endl;
			}
			else{
				if(pd){
					cout<<"+sqrt("<<dlt<<")/"<<q<<endl;
				}
				else{
					cout<<"sqrt("<<dlt<<")/"<<q<<endl;
				}
			}
		}
		else{
			if(k>0){
				if(op){
					if(pd){
						cout<<'+'<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
					}
					else{
						cout<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
					}
				}
				else{
					cout<<'-'<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
				}
			}
			else{
				if(op){
					cout<<'-'<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
				}
				else{
					if(pd){
						cout<<'+'<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
					}
					else{
						cout<<p<<"*sqrt("<<dlt<<")/"<<q<<endl;
					}
				}
			}
		}
	}
}
void check(int a,int b,int c){
	int dlt=b*b-4*a*c;
	if(dlt<0){
		cout<<"NO"<<endl;
		return ;
	}
	else{
		search(dlt);
		long double x=(sqrt(dlt)-b)/(2*a),y=(-sqrt(dlt)-b)/(2*a);
		if(flag){
			if(x>y){
				Cout(val-b,2*a);
				cout<<endl;
			}
			else{
				Cout(-val-b,2*a);
				cout<<endl;
			}
		}
		else{
			if(x>y){
				CCout(1,dlt,a,b);
			}
			else{
				CCout(0,dlt,a,b);
			}
		}
	}
	return ;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>t>>m;
	int n=5*m*m;
	for(int i=0;i*i<=n;i++){
		sq.push_back(i*i);
	}
	while(t--){
		cin>>a>>b>>c;
		check(a,b,c);
	}
	return 0;
}
2024/7/14 16:38
加载中...