結果
| 問題 |
No.1179 Quadratic Equation
|
| コンテスト | |
| ユーザー |
hamray
|
| 提出日時 | 2020-08-21 21:52:11 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 13,108 bytes |
| コンパイル時間 | 1,654 ms |
| コンパイル使用メモリ | 92,508 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-15 05:34:01 |
| 合計ジャッジ時間 | 2,254 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 11 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:557:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
557 | scanf("%lld %lld %lld", &a, &b, &c);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <cstdio>
#include <cmath>
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
class Int {
public:
Int(long long num = 0)
{
digit.clear();
sign = 1;
if (num == 0) {
digit.push_back(0);
} else {
if (num < 0) {
sign = -1;
num = -num;
}
while (num) {
digit.push_back(num % 10000);
num /= 10000;
}
}
}
~Int() {}
Int& operator=(const Int& num)
{
this->digit = num.digit;
this->sign = num.sign;
return *this;
}
Int& operator=(long long num)
{
return *this = (Int)num;
}
const bool operator<(const Int& num) const
{
if (sign != num.sign) return sign == -1;
if (digit.size() != num.digit.size()) {
if (sign == 1) {
return digit.size() < num.digit.size();
} else {
return digit.size() > num.digit.size();
}
}
for (int i = digit.size() - 1; i >= 0; i--) {
if (digit[i] != num.digit[i]) {
if (sign == 1) {
return digit[i] < num.digit[i];
} else {
return digit[i] > num.digit[i];
}
}
}
return false;
}
const bool operator>(const Int& num) const
{
return num < *this;
}
const bool operator<=(const Int& num) const
{
return !(num < *this);
}
const bool operator>=(const Int& num) const
{
return !(*this < num);
}
const bool operator!=(const Int& num) const
{
return *this < num || num < *this;
}
const bool operator==(const Int& num) const
{
return !(*this < num) && !(num < *this);
}
friend istream& operator>>(istream& is, Int& num)
{
string s;
is >> s;
num.digit.clear();
if (s[0] == '-') {
num.sign = -1;
} else {
num.sign = 1;
}
for (int i = s.size() - 1; i >= 0; i -= 4) {
int sum = 0, tmp = 1;
for (int j = 0; j < 4; j++) {
if (i - j < 0) break;
if (!(s[i - j] >= '0' && s[i - j] <= '9')) break;
sum += (s[i - j] - '0') * tmp;
tmp *= 10;
}
num.digit.push_back(sum);
}
num.remove();
return is;
}
friend ostream& operator<<(ostream& os, const Int& num)
{
if (num.sign == -1) os << "-";
os << num.digit[num.digit.size() - 1];
for (int i = (int)num.digit.size() - 2; i >= 0; i--) os << setw(4) << setfill('0') << num.digit[i];
return os;
}
Int operator-() const
{
Int num = *this;
if (digit.size() > 1 || digit[0] > 0 || sign == -1) num.sign *= -1;
return num;
}
Int operator++(int)
{
Int ans = *this;
*this = *this + 1;
return ans;
}
Int& operator++()
{
return *this = *this + 1;
}
Int operator--(int)
{
Int ans = *this;
*this = *this - 1;
return ans;
}
Int& operator--()
{
return *this = *this - 1;
}
const Int operator+(const Int& num) const
{
if (this->sign == num.sign) {
Int ans = add(*this, num);
ans.sign = this->sign;
ans.remove();
return ans;
} else if (cmp_abs(*this, num)) {
Int ans = sub(num, *this);
if (this->sign == 1) ans.sign = -1;
ans.remove();
return ans;
} else {
Int ans = sub(*this, num);
if (num.sign == 1) ans.sign = -1;
ans.remove();
return ans;
}
}
const Int operator-(const Int& num) const
{
return *this + (-num);
}
const Int operator*(const Int& num) const
{
Int ans = mul(*this, num);
ans.sign = this->sign * num.sign;
ans.remove();
return ans;
}
const Int operator/(const Int& num) const
{
Int ans = div(*this, num);
ans.sign = this->sign * num.sign;
ans.remove();
return ans;
}
const Int operator%(const Int& num) const
{
return *this - *this / num * num;
}
const Int operator^(const Int& num) const
{
Int ans = pow(*this, num);
if (this->sign == -1 && (num.digit[0] & 1) == 1) ans.sign = -1;
return ans;
}
Int operator+=(const Int& num)
{
return *this = *this + num;
}
Int operator-=(const Int& num)
{
return *this = *this - num;
}
Int operator*=(const Int& num)
{
return *this = *this * num;
}
Int operator/=(const Int& num)
{
return *this = *this / num;
}
Int operator%=(const Int& num)
{
return *this = *this % num;
}
Int operator^=(const Int& num)
{
return *this = *this ^ num;
}
Int fact(void) const
{
Int ans = *this;
long long c, p;
ans.shift();
ans++;
c = ans.digit[0];
if (ans.digit.size() > 1) c += ans.digit[1] * 10000;
p = c * c - 1;
if ((digit[0] & 1) == 0) c--;
for (int i = 1; i < c; i++) {
ans *= p;
p -= i * 2 + 1;
}
return ans;
}
private:
vector <int> digit;
int sign;
void remove(void)
{
for (int i = digit.size() - 1; i > 0; i--) {
if (digit[i] > 0) break;
digit.pop_back();
}
if (digit.size() == 1 && digit[0] == 0 && sign == -1) sign = 1;
}
void shift(void)
{
int c = 0;
for (int i = digit.size() - 1; i >= 0; i--) {
digit[i] += c * 10000;
c = digit[i] % 2;
digit[i] /= 2;
}
remove();
}
const bool cmp_abs(const Int& a, const Int& b) const
{
if (a.digit.size() != b.digit.size()) return a.digit.size() < b.digit.size();
for (int i = a.digit.size() - 1; i >= 0; i--) {
if (a.digit[i] != b.digit[i]) return a.digit[i] < b.digit[i];
}
return false;
}
Int add(const Int& a, const Int& b) const
{
int c = 0;
Int ans;
ans.digit.clear();
for (int i = 0; i < (int)a.digit.size() || i < (int)b.digit.size(); i++) {
int tmp = c;
if (i < (int)a.digit.size()) tmp += a.digit[i];
if (i < (int)b.digit.size()) tmp += b.digit[i];
c = tmp / 10000;
ans.digit.push_back(tmp % 10000);
}
if (c > 0) ans.digit.push_back(c);
return ans;
}
Int sub(const Int& a, const Int& b) const
{
int i;
Int ans = a;
ans.sign = 1;
for (i = 0; i < (int)b.digit.size(); i++) {
ans.digit[i] -= b.digit[i];
if (ans.digit[i] < 0) {
ans.digit[i + 1]--;
ans.digit[i] += 10000;
}
}
for (; i < (int)ans.digit.size(); i++) {
if (ans.digit[i] >= 0) break;
ans.digit[i + 1]--;
ans.digit[i] += 10000;
}
return ans;
}
Int mul(const Int& a, const Int& b) const
{
Int ans;
ans.digit = vector<int>(a.digit.size() + b.digit.size(), 0);
for (int i = 0; i < (int)ans.digit.size(); i++) {
for (int j = max(0, i - (int)b.digit.size() + 1); j <= i && j < (int)a.digit.size(); j++) {
ans.digit[i] += a.digit[j] * b.digit[i - j];
if (ans.digit[i] >= 10000) {
ans.digit[i + 1] += ans.digit[i] / 10000;
ans.digit[i] %= 10000;
}
}
}
return ans;
}
Int div(const Int& a, const Int& b) const
{
Int ans, x = a, y = b;
int c = a.digit.size() - b.digit.size();
if (cmp_abs(a, b)) return 0;
x.sign = y.sign = 1;
ans.digit = vector<int>(x.digit.size() - y.digit.size() + 1, 0);
y.digit.insert(y.digit.begin(), x.digit.size() - y.digit.size(), 0);
if (y > x) {
y.digit.erase(y.digit.begin());
c--;
}
for (int i = c; i >= 0; i--) {
int p = x.digit[x.digit.size() - 1], l, r, m;
Int q;
if (x < y) {
y.digit.erase(y.digit.begin());
continue;
}
if (x.digit.size() != y.digit.size()) p = p * 10000 + x.digit[x.digit.size() - 2];
l = p / (y.digit[y.digit.size() - 1] + 1);
r = p / y.digit[y.digit.size() - 1] + 1;
m = (l + r) / 2;
while (r - l > 1) {
if (y * m > x) {
r = m;
m = (l + r) / 2;
} else {
l = m;
m = (l + r) / 2;
}
}
ans.digit[i] = l;
x -= y * l;
y.digit.erase(y.digit.begin());
}
return ans;
}
Int pow(const Int& a, const Int& b) const
{
Int ans = 1, x = a, y = b;
if (a == 0) return 0;
if (b.sign == -1) {
if (a == 1 && b == -1) {
return 1;
} else {
return 0;
}
}
while (y.digit.size() > 1 || y.digit[0] > 0) {
if (y.digit[0] & 1) ans *= x;
x *= x;
y.shift();
}
return ans;
}
};
const bool operator<(int a, const Int& b)
{
return (Int)a < b;
}
const bool operator>(int a, const Int& b)
{
return (Int)a > b;
}
const bool operator<=(int a, const Int& b)
{
return (Int)a <= b;
}
const bool operator>=(int a, const Int& b)
{
return (Int)a >= b;
}
const bool operator!=(int a, const Int& b)
{
return (Int)a != b;
}
const bool operator==(int a, const Int& b)
{
return (Int)a == b;
}
Int operator+(int a, const Int& b)
{
return (Int)a + b;
}
Int operator-(int a, const Int& b)
{
return (Int)a - b;
}
Int operator*(int a, const Int& b)
{
return (Int)a * b;
}
Int operator/(int a, const Int& b)
{
return (Int)a / b;
}
Int operator%(int a, const Int& b)
{
return (Int)a % b;
}
Int operator^(int a, const Int& b)
{
return (Int)a ^ b;
}
int main()
{
int t, i;
t = 1;
for (i = 0; i < t; i++) {
long long a, b, c;
scanf("%lld %lld %lld", &a, &b, &c);
if (a == 0) {
if (b == 0) {
if (c == 0) {
puts("3");
} else {
puts("0");
}
} else {
if (c == 0) {
puts("1 0");
} else {
printf("%.12Lf\n", -(long double)c / b);
}
}
} else {
Int x = b, y = 4;
x *= b;
y *= a;
y *= c;
if (x < y) {
puts("imaginary");
} else if (x == y) {
if (b == 0) {
puts("1 0");
} else {
printf("%.12Lf\n", -(long double)b / a / 2);
}
} else {
long double x = (long double)b * b - (long double)4.0 * a * c;
long double p = (-(long double)b - sqrt(x)) / 2 / a;
long double q = (-(long double)b + sqrt(x)) / 2 / a;
if (p > q) {
long double tmp = p;
p = q;
q = tmp;
}
printf("%.12Lf %.12Lf\n", p, q);
}
}
}
return 0;
}
hamray