变态的大模拟……
洛谷题目传送门https://www.luogu.com.cn/problem/P9750
解题思路
主要还是模拟,题目让你求啥你就求啥,要注意细节。
然后化简根式的可以用质因数分解一下即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int q,n;
int aabs(int x)//绝对值
{
if(x<0)return -x;
return x;
}
int cnt[1001];
int delta;
int qpow(int a,int b)//快速幂
{
int res=1;
while(b)
{
if(b&1)
res*=a;
a*=a;
b>>=1;
}
return res;
}
int calc(int del)//质因数分解化简根式
{
memset(cnt,0,sizeof cnt);
int res=1;
int temp=del;
vector<int> ttt;
for(int i=2;i<=temp;i++)
{
if(temp%i==0)
{
while(temp%i==0)
{
cnt[i]++;
temp/=i;
}
ttt.push_back(i);
}
}
del=1;
for(auto i:ttt)
{
if(cnt[i]%2)//处理分解的因数
{
del*=i;
cnt[i]--;
}
if(cnt[i]%2==0)
{
res*=qpow(i,cnt[i]/2);
}
}
delta=del;
return res;
}
signed main()
{
// freopen("P9750_4.in","r",stdin);
// freopen("aa.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>q>>n;
int a,b,c;
int temp,fz,fm,g;
int fz2,fm2;
int q1,q2,r;
while(q--)
{
cin>>a>>b>>c;
delta=b*b-4*a*c;
if(delta<0)//delta小于0,无解
{
cout<<"NO"<<endl;
continue;
}
temp=sqrt(delta);
if(temp*temp==delta)//若有有理数解
{
fz=-b+temp;
fz2=-b-temp;
fm=2*a;
if(fz2*fm>fz*fm)//题目说了,要取较大的解
fz=fz2;
g=__gcd(aabs(fz),aabs(fm));
fz/=g;
fm/=g;
if(aabs(fm)==1)
{
if(fz*fm>=0)
cout<<aabs(fz);
else
cout<<"-"<<aabs(fz);
}
else{
if(fz*fm<0)
cout<<"-"<<aabs(fz)<<"/"<<aabs(fm);
else
cout<<aabs(fz)<<"/"<<aabs(fm);
}
}
else{//没有有理数解
fz=-b;
fm=2*a;
g=__gcd(aabs(fz),aabs(fm));
fz/=g;
fm/=g;
if(fz)
{
if(aabs(fm)==1)
{
if(fz*fm>0)
cout<<aabs(fz);
else
cout<<"-"<<aabs(fz);
}
else{
if(fz*fm<0)
cout<<"-"<<aabs(fz)<<"/"<<aabs(fm);
else
cout<<aabs(fz)<<"/"<<aabs(fm);
}
cout<<"+";
}
q2=calc(delta);
double t=q2/double(2*a);
int t2=t;
if(t-t2==0)
{
if(aabs(t2)==1)
cout<<"sqrt("<<delta<<")";
else
cout<<aabs(t2)<<"*sqrt("<<delta<<")";
}
else
{
t=1/t;
t2=t;
if(t-t2==0)
cout<<"sqrt("<<delta<<")/"<<aabs(t2);
else{
fz=q2;
fm=2*a;
g=__gcd(aabs(fz),aabs(fm));
fz/=g;
fm/=g;
if(aabs(fz)==1)
{
cout<<"sqrt("<<delta<<")/"<<aabs(fm);
}
else
cout<<aabs(fz)<<"*sqrt("<<delta<<")/"<<aabs(fm);
}
}
}
cout<<endl;
}
}
最后,祝各位大佬 csp2024 rp++!