#include<bits/stdc++.h>
using namespace std;
int T,M;
int a,b,c;
string ans;
int prime_factors(int n){
int ans=1;
int x=1;
int cnt=0;
while(n%2==0){
n/=2;
x*=2;
cnt++;
}
if(cnt%2==0) ans *= sqrt(x);
else ans *= sqrt(x/2);
for(int i=3;i<=sqrt(n);i+=2){
cnt=0;
x=1;
while(n%i==0){
n/=i;
x*=i;
cnt++;
}
if(cnt%2==0) ans *= sqrt(x);
else ans *= sqrt(x/i);
}
return ans;
}
int mysqrt(int x){
int y = sqrt(x);
if(y*y==x) return y;
else return -1;
}
int add(int p,int q){
int x = __gcd(p,q);
p/=x,q/=x;
if(q<0){
p=-p;
q=-q;
}
if(p==0){
return 1;
}
else if(q==1){
ans += to_string(p);
}
else{
string a,b;
a = to_string(p);
b = to_string(q);
ans = ans + a + '/'+ b;
}
return 0;
}
void add2(int p,int r,int q){
int x = __gcd(p,q);
p/=x,q/=x;
if(p<0){
p=-p;
q=-q;
}
if(p==q){//p/q==1不行
ans+="sqrt(";
ans+=to_string(r);
ans+=')';
}
else{
if(q==1){
int y = p/q;
ans+=to_string(y);
ans+='*';
ans+="sqrt(";
ans+=to_string(r);
ans+=')';
}
else if(p==1){
ans+="sqrt(";
ans+=to_string(r);
ans+=')';
ans+='/';
ans+=to_string(q);
}
else{
ans+=to_string(p);
ans+='*';
ans+="sqrt(";
ans+=to_string(r);
ans+=')';
ans+='/';
ans+=to_string(q);
}
}
return ;
}
int main(){
scanf("%d%d",&T,&M);
while(T--){
ans.clear();
scanf("%d%d%d",&a,&b,&c);
int d = b*b-4*a*c;
if(d<0){
//这部分没有问题
printf("NO\n");
continue;
}
else{
//这部分60分都过了
if(mysqrt(d)!=-1){
d = sqrt(d);
if(a>0){
if(add(-b+d,2*a)){
ans="0";
}
}
else{
if(add(-b-d,2*a)){
ans="0";
}
}
}
else{
//这部分40分一分没有得
int p=prime_factors(d);
int r=d/(p*p);
int q=2*a;
if(q>0){
b=-b;
if(p/q<0){
p=-p;
b=-b;
}
if(!add(b,q)){
ans+='+';
}
add2(p,r,q);
}
else{
b=-b;
p=-p;
if(p/q<0){
p=-p;
b=-b;
}
if(add(b,q)){
ans+='+';
}
add2(p,r,q);
}
}
cout<<ans<<endl;
}
}
return 0;
}
样例已过,60分,剩下40分WA,是非完全平方部分。因为我下面这个原先写了一半(完全平方的情况的那部分)的代码交上去的时候也是60分,说白了就是后半部分我写了等于没写都是60分。qwq
#include<bits/stdc++.h>
using namespace std;
int T,M;
int a,b,c;
char ans[1001],m=0;
int prime_factors(){
return 0;
}
int mysqrt(int x){
int y = sqrt(x);
if(y*y==x) return y;
else return -1;
}
void add(int p,int q){
int x = __gcd(p,q);
p/=x,q/=x;
if(q<0){
p=-p;
q=-q;
}
if(p==0) ans[++m]='0';
else if(q==1){
string s = to_string(p);
int len = s.size();
for(int i=0;i<len;i++){
ans[++m] = s[i];
}
}
else{
string a,b;
a = to_string(p);
b = to_string(q);
int lena = a.size();
int lenb = b.size();
for(int i=0;i<lena;i++){
ans[++m]=a[i];
}
ans[++m] = '/';
for(int i=0;i<lenb;i++){
ans[++m]=b[i];
}
}
return ;
}
int main(){
scanf("%d%d",&T,&M);
while(T--){
m=0;
scanf("%d%d%d",&a,&b,&c);
int d = b*b-4*a*c;
if(d<0){
printf("NO\n");
continue;
}
else{
if(mysqrt(d)!=-1){
d = sqrt(d);
if(a>0){
add(-b+d,2*a);
}
else{
add(-b-d,2*a);
}
}
else{
}
for(int i=1;i<=m;i++){
printf("%c",ans[i]);
}
printf("\n");
}
}
return 0;
}