結果
問題 | No.1179 Quadratic Equation |
ユーザー | hamray |
提出日時 | 2020-08-21 21:52:11 |
言語 | C++11 (gcc 11.4.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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 1 ms
5,248 KB |
testcase_11 | AC | 1 ms
5,248 KB |
testcase_12 | AC | 1 ms
5,248 KB |
testcase_13 | AC | 2 ms
5,248 KB |
コンパイルメッセージ
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; }