J T3 40分求助
  • 板块学术版
  • 楼主lbh666
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/28 16:21
  • 上次更新2023/11/2 11:03:37
查看原帖
J T3 40分求助
774009
lbh666楼主2023/10/28 16:21

大小样例都过了。

巨丑的代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int t,m,p,q,csp=1;

bool pd(double x){
	int cnt;
	if(x<0)x=-x; 
	cnt=(int)(x)*(int)(x); 
	if(x==sqrt(cnt))return 1;
	else return 0;
}

void cl(int &d){
	int d2=d;
	for(int i=2;i<=m;++i){
		while(d2%(i*i)==0 && d2>=(i*i)){d2/=(i*i);csp*=i;}
		if(d2<(i*i)){d=d2;return ;}
	}
	d=d2;
	return ;
}

signed main(){
//	freopen("uqe2.in","r",stdin);
//	freopen("uqe2.ans","w",stdout);
	cin>>t>>m; 
	while(t--){
		int a,b,c,d;
		double x1,x2,tot,p,q,p2,q2;
		csp=1;
		cin>>a>>b>>c;
		d=b*b-4*a*c; 
		if(d<0){cout<<"NO\n";continue;}
		x1=(-b+sqrt(d))*1.0/(a*2*1.0)*1.0;
		x2=(-b-sqrt(d))*1.0/(a*2*1.0)*1.0;
		p=(-b+sqrt(d))*1.0,q=(a*2*1.0)*1.0;
		p2=(-b-sqrt(d))*1.0,q2=(a*2*1.0)*1.0;
		tot=sqrt(d);
		if(x1<x2){p=p2,q=q2;} 
		if(pd(tot)){
			int p3=(int)(p),q3=(int)(q);
			int flag=0;
			if(p3<0){p3=abs(p3);flag++;}
			if(q3<0){q3=abs(q3);flag++;}
			if(flag==1)flag=1;
			else flag=0;
			int cnt=__gcd(p3,q3);
			p3/=cnt,q3/=cnt;
			if(flag==1)cout<<"-";
			if(q3==1){cout<<p3<<"\n";continue;}
			cout<<p3<<"/"<<q3<<"\n";
		}else{
			double a1=-(b*1.0/(a*2));
			int a4=1/(a*2),flag=0,b2=-b,a2=a*2;
			if(b2<0){b2=abs(b2);flag++;}
			if(a2<0){a2=abs(a2);flag++;}
			double a3=1*1.0/(a*2);
			if(a1!=0){
				if(flag%2==1)cout<<"-";
				int u=__gcd(b2,a2);
				b2/=u,a2/=u;
				if(b2==0){cout<<0<<"\n";continue;} 
				if(a2==1)cout<<b2<<"+"; 
				else cout<<b2<<"/"<<a2<<"+";
			} 
			if(a3==1)printf("sqrt(%d)\n",d);
			else{
				cl(d);
				if(pd(a3))printf("%d*sqrt(%d)\n",csp,d);
				else{
			    	int tu=a*2;
			    	if(tu<0){tu=abs(tu);} 
			    	int rp=__gcd(csp,tu);
			    	csp/=rp,tu/=rp;
			    	if(csp>1)printf("%d*",csp);
			    	printf("sqrt(%d)",d);
			    	if(tu>1)printf("/%d\n",tu);
			    	else printf("\n");
				}
			}
		}
	}
	return 0;
}

求大佬们修改。

2023/10/28 16:21
加载中...