社区讨论
J组T3求助()
灌水区参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo02fv9w
- 此快照首次捕获于
- 2023/10/21 21:18 2 年前
- 此快照最后确认于
- 2023/11/02 12:08 2 年前
rt,求个正解代码也行
CPP#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f, M = 1e3 + 10;
long long T, m;
vector<long long> p;
unordered_map<long long, bool> pf;
vector<long long> wp;
bool visit[M];
void os()
{
visit[1] = 1;
for (long long i = 2; i <= m; i++)
{
if (!visit[i])
p.push_back(i);
for (long long j = 0; j < p.size() && p[j] * i <= m; j++)
{
visit[p[j] * i] = 1;
if (i % p[j] == 0)
break;
}
}
return;
}
bool pwl(long long x)
{
if (x == 0 || x == 1)
return 0;
if (pf.find(x) == pf.end())
return 1;
return 0;
}
void s()
{
long long a, b, c;
long long ans1, ans2, ans3;
cin >> a >> b >> c;
if (b * b - 4 * a * c < 0)
{
cout << "NO" << endl;
return;
}
if (pwl(b * b - 4 * a * c))
{
ans1 = -b;
ans2 = 2 * a;
for (long long i = 0; i < p.size() && p[i] <= min(abs(ans1), abs(ans2)); i++)
{
if (ans1 % p[i] == 0 && ans2 % p[i] == 0)
{
ans1 /= p[i];
ans2 /= p[i];
i--;
}
}
if (ans2 < 0)
{
ans2 *= -1;
ans1 *= -1;
}
if (ans1 != 0)
{
if (ans2 == 1)
cout << ans1 << '+';
else
cout << ans1 << '/' << ans2 << '+';
}
ans1 = b * b - 4 * a * c;
ans3 = 1;
for (long long i = wp.size() - 1; i >= 0; i--)
{
if (wp[i] == 1)
break;
if (wp[i] > ans1)
continue;
if (ans1 % wp[i] == 0)
{
ans3 *= sqrt(wp[i]);
ans1 /= wp[i];
i++;
}
}
if ((long long)(ans3 * 1.0 / 2 / a) == ceil((ans3 * 1.0 / 2 / a)))
{
if (ans3 * 1.0 / 2 / a == 1)
cout << "sqrt(" << abs(ans1) << ")\n";
else
cout << fabs(ans3 * 1.0 / 2 / a) << "*sqrt(" << ans1 << ")\n";
}
else
{
long long ans5 = ans3, ans6 = 2 * a;
for (long long i = 0; i < p.size() && p[i] <= min(abs(ans5), abs(ans6)); i++)
{
if (ans5 % p[i] == 0 && ans6 % p[i] == 0)
{
ans5 /= p[i];
ans6 /= p[i];
i--;
}
}
ans5 = abs(ans5);
ans6 = abs(ans6);
if (ans5 == 1)
cout << "sqrt(" << ans1 << ")/" << ans6 << '\n';
else
cout << ans5 << "*sqrt(" << ans1 << ")/" << ans6 << '\n';
}
return;
}
if (a > 0)
ans1 = -b + sqrt(b * b - 4 * a * c);
else
ans1 = -b - sqrt(b * b - 4 * a * c);
ans2 = 2 * a;
for (long long i = 0; i < p.size() && p[i] <= min(abs(ans1), abs(ans2)); i++)
{
if (ans1 % p[i] == 0 && ans2 % p[i] == 0)
{
ans1 /= p[i];
ans2 /= p[i];
i--;
}
}
if (ans2 < 0)
{
ans2 *= -1;
ans1 *= -1;
}
if (ans2 == 1)
cout << ans1 << endl;
else
cout << ans1 << '/' << ans2 << '\n';
return;
}
signed main()
{
freopen("uqe.in", "r", stdin);
freopen("uqe.out", "w", stdout);
cin >> T >> m;
os();
pf[0] = 1;
for (long long i = 1; i * i <= m * m; i++)
{
wp.push_back(i * i);
pf[i * i] = 1;
}
while (T--)
s();
fclose(stdin);
fclose(stdout);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...