社区讨论
求助 RE爆0!
P9750[CSP-J 2023] 一元二次方程参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @logkhugt
- 此快照首次捕获于
- 2023/11/02 10:28 2 年前
- 此快照最后确认于
- 2023/11/02 10:28 2 年前
考场代码
CPP#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
int T,M;
int xx[60]= {0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936};
bool check_sqrt(int x)
{
for(int i=0; i*i<=x; i++)
{
if(i*i==x)
return true;
}
return false;
}
int Sqrt(int x)
{
for(int i=0; i*i<=x; i++)
{
if(i*i==x)
return i;
}
}
int Gcd(int a,int b)
{
if(a<b) return -1;
if(a%b==0) return b;
else return Gcd(b,a%b);
}
int Sqrt2(int d)
{
for(int i=44; i>=1; i--)
{
if(Gcd(d,xx[i])==xx[i])
{
return i;
}
}
return 1;
}
int main()
{
//freopen("uqe.in","r",stdin);
//freopen("uqe.out","w",stdout);
scanf("%d%d",&T,&M);
while(T--)
{
int a,b,c;
cin>>a>>b>>c;
int d=b*b-4*a*c;
if(d<0)
{
printf("NO\n");
}
else if(check_sqrt(d))
{
int sd=Sqrt(d);
int g=Gcd(max(abs(sd-b),abs(a*2)),min(abs(sd-b),abs(a*2)));
if(g==abs(a*2))
{
printf("%d\n",(sd-b)/(a*2));
}
else
{
if((sd-b<0 && a<0) || (sd-b>0 && a>0))
printf("%d/%d\n",abs(sd-b)/g,abs(a*2)/g);
else
printf("-%d/%d\n",abs(sd-b)/g,abs(a*2)/g);
}
}
else
{
int q2=1,q3=d;
q2=Sqrt2(d);
q3=d/xx[q2];
if(b!=0)
{
int g=Gcd(abs(b),abs(a*2));
if(g==abs(a*2))
{
printf("%d",(-1*b)/(a*2));
}
else
{
if((b>0 && a<0) || (b<0 && a>0))
printf("%d/%d",abs(b)/g,abs(a*2)/g);
else
printf("-%d/%d",abs(b)/g,abs(a*2)/g);
}
printf("+");
}
if(q2==a*2)
{
printf("sqrt(%d)\n",q3);
}
else if(Gcd(abs(q2),abs(a*2))==abs(a*2))
{
printf("%d*sqrt(%d)\n",q2/(a*2),q3);
}
else if(Gcd(abs(a*2),abs(q2))==abs(q2))
{
int g=Gcd(abs(a*2),abs(q2));
printf("sqrt(%d)/%d\n",q3,(a*2)/g);
}
else
{
int g=Gcd(max(abs(a*2),abs(q2)),min(abs(a*2),abs(q2)));
if((q2<0 && a<0) || (q2>0 && a>0))
printf("%d*sqrt(%d)/%d\n",abs(q2)/g,q3,abs(a*2)/g);
else
printf("-%d*sqrt(%d)/%d\n",abs(q2)/g,q3,abs(a*2)/g);
}
}
}
cout<<endl;
//fclose(stdin);
//fclose(stdout);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...