在本题中输出有理数 ? v 时须遵循以下规则:
由有理数的定义,存在唯一的两个整数 ? p 和 ? q,满足 ?
0 q>0, gcd ( ? , ? ) 1 gcd(p,q)=1 且 ? ? ? v= q p 。 若 ? 1 q=1,则输出 {p},否则输出 {p}/{q},其中 {n} 代表整数 ? n 的值;
例如:
当 ? − 0.5 v=−0.5 时, ? p 和 ? q 的值分别为 − 1 −1 和 2 2,则应输出 -1/2; 当 ? 0 v=0 时, ? p 和 ? q 的值分别为 0 0 和 1 1,则应输出 0。 对于方程的求解,分两种情况讨论:
若 Δ ? 2 − 4 ? ? < 0 Δ=b 2 −4ac<0,则表明方程无实数解,此时你应当输出 NO;
否则 Δ ≥ 0 Δ≥0,此时方程有两解(可能相等),记其中较大者为 ? x,则:
若 ? x 为有理数,则按有理数的格式输出 ? x。
否则根据上文公式, ? x 可以被唯一表示为 ? ? 1 + ? 2 ? x=q 1 +q 2
r 的形式,其中:
? 1 , ? 2 q 1 ,q 2 为有理数,且 ? 2
0 q 2
0; ? r 为正整数且 ?
1 r>1,且不存在正整数 ?
1 d>1 使 ? 2 ∣ ? d 2 ∣r(即 ? r 不应是 ? 2 d 2 的倍数); 此时:
若 ? 1 ≠ 0 q 1
=0,则按有理数的格式输出 ? 1 q 1 ,并再输出一个加号 +; 否则跳过这一步输出; 随后:
若 ? 2 1 q 2 =1,则输出 sqrt({r}); 否则若 ? 2 q 2 为整数,则输出 {q2}*sqrt({r}); 否则若 ? 3
1 ? 2 q 3
q 2
1 为整数,则输出 sqrt({r})/{q3}; 否则可以证明存在唯一整数 ? , ? c,d 满足 ? , ?
1 , gcd ( ? , ? ) 1 c,d>1,gcd(c,d)=1 且 ? 2 ? ? q 2 d c ,此时输出 {c}*sqrt({r})/{d}; 上述表示中 {n} 代表整数 {n} 的值,详见样例。
如果方程有实数解,则按要求的格式输出两个实数解中的较大者。否则若方程没有实数解,则输出 NO。
输入格式 输入的第一行包含两个正整数 ? , ? T,M,分别表示方程数和系数的绝对值上限。
#include<bits/stdc++.h>
using namespace std;
int T,m,a,b,c,d,k,t;
int gcd(int a,int b){
return b?gcd(b,a%b):a;}
void Main(){
cin>>a>>b>>c;
if(a<0)
a=-a,b=-b,c=-c;
d=b*b-4*a*c,k=1;
if(d<0){
cout<<"NO\n";
return;}
for(int i=2;i*i<=d;i++)
while(d%(i*i)==0)
k*=i,d/=(i*i);
if(d==0||d==1){
t=abs(gcd(2*a,-b+k*d));
cout<<(-b+k*d)/t;
if(2*a/t!=1)
cout<<'/'<<2*a/t;
cout<<'\n';
return;}
t=abs(gcd(-b,2*a));
if(-b/t==0)
goto g;
cout<<-b/t;
if(2*a/t!=1
cout<<'/'<<2*a/t;
cout<<'+';
t=abs(gcd(k,2*a));
if(k/t!=1)
cout<<k/t<<'*';
cout<<"sqrt("<<d<<')';
if(2*a/t!=1)
cout<<'/'<<2*a/t;
cout<<'\n';
return;}
int main(){
for(cin>>T>>m;T;--T)
Main();
return 0;}
怎么全WA了?