J-T3 RE求解
  • 板块学术版
  • 楼主carp_oier
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/21 19:39
  • 上次更新2023/11/2 12:11:26
查看原帖
J-T3 RE求解
1036693
carp_oier楼主2023/10/21 19:39
#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define rl register ll
#define wl putchar('\n')
#define ws putchar(' ')

template <class T> inline void read(T &res)
{
	char ch = getchar(); bool f = 0; res = 0;
	for(; !isdigit(ch); ch = getchar()) f |= ch == '-';
	for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
	res = f ? ~res + 1 : res;
}

template <class T> void waw(T x) { if(x > 9) waw(x / 10); putchar(x % 10 ^ 48); }

template <class T> void ww(T x) { if(x < 0) x = ~x + 1, putchar('-'); waw(x); }

ll T, M, a, b, c, delta;

ll mi[1050];

ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }

inline bool check()
{
	delta = b * b - 4 * a * c;
	return (delta < 0) ? false : true;
}

inline ll qmi(ll a, ll k)
{
	ll res = 1;
	while(k)
	{
		if(k & 1) res = res * a;
		a = a * a; k >>= 1;
	}
	return res;
}

inline void init()
{
	for(rl i=1; i <= 32; ++ i) mi[i * i] = i;
}

inline ll calc(ll x)
{
	ll q = 1, del = x, cnt = 0;
	for(rl i=2; i <= sqrt(x); ++ i)
	{
		if(x % i == 0)
		{
			cnt = 0;
			while(x % i == 0) { x /= i; ++ cnt; }
			if(cnt > 1) q *= qmi(i, cnt >> 1);
		}
	}
	
	delta = del / (q * q);
	return q;
}

int main()
{
	freopen("uqe.in", "r", stdin), freopen("uqe.out", "w", stdout);	

	init();
	
	read(T), read(M);
	
	while(T -- )
	{
		read(a), read(b), read(c);
		
		if(!check()) 
		{
			puts("NO");
			continue;
		}
		else
		{
			if(delta == 0 || mi[delta])
			{
				ll ta = a * 2, tb = -1 * b + mi[delta];
				ll d = gcd(abs(ta), abs(tb)); // Լ�� 
				ta /= d, tb /= d;  
				if(ta < 0) ta = ~ta + 1, tb = ~tb + 1; // �������� 
				if(ta == 1) printf("%lld\n", tb); // �����ĸΪ 1�� ֱ�����tb 
				else printf("%lld/%lld\n", tb, ta); //  ��������ֺ���ʽ  
			}
			else
			{
				ll ta = a * 2, tb = -1 * b;
				if(tb == 0)
				{
					ll q2 = calc(delta);
					ll d = gcd(abs(q2), abs(ta));
					ta /= d, q2 /= d;
					if(ta < 0) ta = ~ta + 1, q2 = ~q2 + 1;
					if(q2 == 1 && ta != 1) printf("sqrt(%lld)/%lld\n", delta, ta);
					else if(q2 != 1 && ta != 1) printf("%lld*sqrt(%lld)/%lld\n", q2, delta, ta);
					else if(q2 == 1 && ta == 1) printf("sqrt(%lld)\n", delta);
					else if(q2 != 1 && ta == 1) printf("%lld*sqrt(%lld)\n", q2, delta);
				} 
				else
				{
					ll d = gcd(abs(ta), abs(tb));  
					ll qa = ta;
					ta /= d, tb /= d;
					if(ta < 0) ta = ~ta + 1, tb = ~tb + 1;
					if(ta == 1) printf("%lld", tb);
					else printf("%lld/%lld", tb, ta);
					
					ll q2 = calc(delta);
					ll dd = gcd(abs(q2), abs(qa));
					if(qa < 0) qa = ~qa + 1, q2 = ~q2 + 1;
					qa /= dd, q2 /= dd;
					
					if(qa == 1 && q2 == 1) printf("+sqrt(%lld)\n", delta); 
					else if(qa == 1 && q2 != 1) printf("+%lld*sqrt(%lld)\n", q2, delta);
					else if(qa != 1 && q2 == 1) printf("+sqrt(%lld)/%lld\n", delta, qa);
					else if(qa != 1 && q2 != 1) printf("+%lld*sqrt(%lld)/%lld\n", q2, delta, qa);
				}
			}
		}
	}
	return 0;
}

2023/10/21 19:39
加载中...