0分求调
查看原帖
0分求调
1412938
A7F3jK9pR0xf_楼主2024/8/8 23:51
#include <bits/stdc++.h>
using namespace std;
map<int, int>mp;
inline int fastpow(int a, int b)
{
	if(b == 0) return 1;
	if(b == 1) return a;
	int tmp = fastpow(a, b/2);
	if(b & 1) return tmp*tmp*a;
	return tmp*tmp;
}
inline bool n2(int n)
{
	int sqr = sqrt(n);
	return sqr*sqr == n;
}
inline int gcd(int a, int b)
{
	return b ? gcd(b, a%b) : a;
}
inline void print(double v)
{
	int flag = 1;
	if(v < 0)
	{
		v = -v;
		flag = -1;
	}
	int p, q;
	for(q = 1;;++q)
	{
		p = v*q;
		if(v*q == p && gcd(p, q) == 1) break; 
	}
	if(q == 1) cout << v*flag;
	else cout << p*flag << "/" << q;
}
inline void px(int n)
{
	mp.clear();
	int tmp = n;
	for(int i = 2;i <= n/i;++i)
	{
		while(tmp % i == 0)
		{
			tmp /= i;
			mp[i]++;
		}
		if(tmp == 1) return;
	}
	if(tmp > 1) mp[tmp]++;
}
inline pair<int, int> cd(double v)
{
	int flag = 1;
	if(v < 0)
	{
		v = -v;
		flag = -1;
	}
	int c, d;
	for(d = 2;;++d)
	{
		c = v*d;
		if(c > 1 && d > 1 && v*d == c && gcd(c, d) == 1) break;
	}
	return make_pair(c*flag, d);
}
int main()
{
	int t, m, a, b, c;
	scanf("%d%d", &t, &m);
	while(t--)
	{
		scanf("%d%d%d", &a, &b, &c);
		int tri = b*b-4*a*c;
		if(tri < 0)
		{
			printf("NO\n");
			continue;
		}
		double x;
		if(n2(tri))
		{
			x = (-b+sqrt(tri))/(2*a);
			print(x);
			cout << "\n";
			continue;
		}
		/*
		q1 = -b/(2*a)
		tri = m1*sqrt(m2)
		q2 = m1/(2*a)
		r = m2
		*/
		double q1 = 1.0*(-b)/(2*a);
		if(q1 != 0)
		{
			print(q1);
			cout << "+";
		}
		px(tri);
		double m1 = 1.0;
		for(auto i : mp)
			m1 *= fastpow(i.first, i.second/2*2);
		double q2 = sqrt(m1)/(2*a);
		double q3 = 1.0/q2;
		int r = tri/m1;
		if(q2 == 1) printf("sqrt(%d)\n", r);
		else if((int)(q2) == q2)
		{
			cout << q2;
			printf("*sqrt(%d)\n", r);	
		} 
		else if((int)(q3) == q3)
		{
			printf("sqrt(%d)/", r);
			cout << q3 << "\n";
		} 
		else
		{
			pair<int, int>fj = cd(q2);
			cout << fj.first;
			printf("*sqrt(%d)/", r);
			cout << fj.second << "\n";
		} 
	}
	return 0;
}

2024/8/8 23:51
加载中...