变态的大模拟……
洛谷题目传送门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);elsecout<<"-"<<aabs(fz);}else{if(fz*fm<0)cout<<"-"<<aabs(fz)<<"/"<<aabs(fm);elsecout<<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);elsecout<<"-"<<aabs(fz);}else{if(fz*fm<0)cout<<"-"<<aabs(fz)<<"/"<<aabs(fm);elsecout<<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<<")";elsecout<<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);} elsecout<<aabs(fz)<<"*sqrt("<<delta<<")/"<<aabs(fm);}}}cout<<endl;}
}
最后,祝各位大佬 csp2024 rp++!