当前位置: 首页 > article >正文

[CSP-J 2023] 一元二次方程(模拟)

变态的大模拟……

洛谷题目传送门icon-default.png?t=O83Ahttps://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++!


http://www.kler.cn/news/365776.html

相关文章:

  • Rust的move关键字在线程中的使用
  • 算法剖析:二分查找
  • Spring Cloud:构建高可用分布式系统的利器
  • leetcode day4 409+5
  • 苹果瑕疵数据集苹果质量数据集YOLO格式VOC格式 深度学习 目标检测 数据集
  • 利用数据库过滤和元数据提取提升多跳查询的RAG性能
  • 系统架构图设计(行业领域架构)
  • Spark 的 Http Broadcast 和 Torrent Broadcast 广播实现类的对比
  • 000010 - Mapreduce框架原理
  • JS 中 reduce()方法及使用
  • 【Android】Kotlin教程(1)
  • C#从零开始学习(用户界面)(unity Lab4)
  • UE5 第一人称示例代码阅读0 UEnhancedInputComponent
  • python实现斗地主
  • qt项目使用其他项目的.ui之指针
  • RabbitMQ安装部署
  • Elliott Wave Prophet,艾略特波浪预测指标!预测未来走势!免费公式!(指标教程)
  • 考研篇——数据结构王道3.2.2_队列的顺序实现
  • 大一物联网要不要转专业,转不了该怎么办?
  • Scala的多态:定义,作用,实现手法
  • AUTOSAR从入门到精通-英飞凌GTM模块
  • Go语言生成UUID的利器:github.com/google/uuid
  • Node.js 路由
  • 文本预处理——构建词云
  • 【云效】阿里云云效:一站式DevOps平台介绍与使用教程(图文)附PPT
  • 2024 项目管理工具大变革:Jira 的替代者是谁?