社区讨论
10分求调(玄关)
P9750[CSP-J 2023] 一元二次方程参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjh9j7u
- 此快照首次捕获于
- 2025/11/04 02:32 4 个月前
- 此快照最后确认于
- 2025/11/04 02:32 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,M;
struct node{
int a,b;
};
inline bool isp(int n){
if(n<=1)return 1;
for(int i=1;i*i<=n;i++)if(n%i==0)return 0;
return 1;
}
inline vector<node>pf(int n){
int i=-1;
vector<node>res;
for(int x=2;;x++){
if(isp(n))break;
i++;
res.push_back({x,0});
while(n%x==0){
res[i].b++;
n/=x;
}
}
return res;
}
inline int p(int a,int b) {
if (b==0)return 1;
int res=p(a,b/2);
if (b%2)return res*res*a;
else return res*res;
}
signed main(){
cin>>T>>M;
while(T--){
int a,b,c;
cin>>a>>b>>c;
int d=b*b-4*a*c;
if(d<0){
cout<<"NO"<<endl;
continue;
}
int q1=-b,q2=1;
vector<node>r=pf(d);
for(int i=0;i<r.size();i++){
if(r[i].b%2==0){
q2*=p(r[i].a,r[i].b/2);
d/=p(r[i].a,r[i].b);
}else{
q2*=p(r[i].a,(r[i].b-1)/2);
d/=p(r[i].a,r[i].b-1);
}
}
int v=((-b+q2*sqrt(d))*1.0/(2*a*1.0)>(-b-q2*sqrt(d))*1.0/(2*a*1.0)?1:-1);
int a1=2*a,a2=2*a;
int g1=gcd(abs(q1),abs(a1)),g2=gcd(abs(q2),abs(a2));
q1/=g1;a1/=g1,q2/=g2,a2/=g2;
if(a1<0){
q1=-q1;
a1=-a1;
}
if(a2<0){
q2=-q2;
a2=-a2;
}
if(d<=1){
if(d==0){
if(q1==0)cout<<0;
else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
else if(q1!=1&&a1==1)cout<<q1;
else if(q1!=1&&a1==-1)cout<<-q1;
else cout<<q1<<'/'<<a1;
}else{
if(a1==a2){
int x=q1+q2;
int g3=gcd(abs(x),abs(a1));
x/=g3;
a1/=g3;
if(x==0)cout<<0;
else if(abs(x)==1&&abs(a1)==1)cout<<x/a1;
else if(x!=1&&a1==1)cout<<x;
else if(x!=1&&a1==-1)cout<<-x;
else cout<<x<<'/'<<a1;
}else{
if(q1==0)cout<<"";
else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
else if(q1!=1&&a1==1)cout<<q1;
else if(q1!=1&&a1==-1)cout<<-q1;
else cout<<q1<<'/'<<a1;
int op=(q2>0?1:-1);
if(q1!=0){
if(v*op==1)cout<<'+';
else cout<<'-';
}
if(a2==1)cout<<abs(q2);
else cout<<abs(q2)<<'/'<<a2;
}
}
}else{
if(q1==0)cout<<"";
else if(abs(q1)==1&&abs(a1)==1)cout<<q1/a1;
else if(q1!=1&&a1==1)cout<<q1;
else if(q1!=1&&a1==-1)cout<<-q1;
else cout<<q1<<'/'<<a1;
int op=(q2>0?1:-1);
if(q1!=0){
if(v*op==1)cout<<'+';
else cout<<'-';
}
if(abs(q2)==1){
cout<<"sqrt("<<d<<')';
if(a2!=1)cout<<'/'<<a2;
}else{
if(q1!=0)cout<<abs(q2)<<"*sqrt("<<d<<')';
else cout<<q2<<"*sqrt("<<d<<')';
if(a2!=1)cout<<'/'<<a2;
}
}
cout<<endl;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...