結果
| 問題 | No.40 多項式の割り算 |
| コンテスト | |
| ユーザー |
not_522
|
| 提出日時 | 2015-07-17 08:34:26 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 4 ms / 5,000 ms |
| コード長 | 3,928 bytes |
| 記録 | |
| コンパイル時間 | 2,502 ms |
| コンパイル使用メモリ | 166,260 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-08 08:20:58 |
| 合計ジャッジ時間 | 2,630 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
namespace arithmetic {
template<typename T> class Addition {
public:
template<typename V> T operator+(const V& v) const {
T res(static_cast<const T&>(*this));
return res += static_cast<T>(v);
}
};
template<typename T> class Subtraction {
public:
template<typename V> T operator-(const V& v) const {
T res(static_cast<const T&>(*this));
return res -= static_cast<T>(v);
}
};
template<typename T> class Multiplication {
public:
template<typename V> T operator*(const V& v) const {
T res(static_cast<const T&>(*this));
return res *= static_cast<T>(v);
}
};
template<typename T> class Division {
public:
template<typename V> T operator/(const V& v) const {
T res(static_cast<const T&>(*this));
return res /= static_cast<T>(v);
}
};
template<typename T> class Modulus {
public:
template<typename V> T operator%(const V& v) const {
T res(static_cast<const T&>(*this));
return res %= static_cast<T>(v);
}
};
}
template<typename T> class IndivisibleArithmetic : public arithmetic::Addition<T>, public arithmetic::Subtraction<T>, public arithmetic::Multiplication<T> {};
template<typename T> class Arithmetic : public IndivisibleArithmetic<T>, public arithmetic::Division<T> {};
template<typename T> class Polynomial : public Arithmetic<Polynomial<T>>, public arithmetic::Modulus<Polynomial<T>> {
private:
vector<T> val;
void normalize() {
while (val.size() > 1u && val.back() == 0) val.pop_back();
if (val.empty()) val.emplace_back(0);
}
public:
Polynomial() {
normalize();
}
Polynomial(const vector<T>& val) : val(val) {
normalize();
}
Polynomial operator+=(const Polynomial& p) {
for (int i = 0; i < p.size(); ++i) {
if (int(val.size()) == i) val.emplace_back(p[i]);
else val[i] += p[i];
}
normalize();
return *this;
}
Polynomial operator-=(const Polynomial& p) {
for (int i = 0; i < p.size(); ++i) {
if (int(val.size()) == i) val.emplace_back(-p[i]);
else val[i] -= p[i];
}
normalize();
return *this;
}
// TODO FFT
Polynomial operator*=(const Polynomial& p) {
Polynomial res;
for (int i = 0; i < size(); ++i) {
for (int j = 0; j < p.size(); ++j) {
res[i + j] += val[i] * p[j];
}
}
*this = res;
normalize();
return *this;
}
Polynomial operator/=(const Polynomial& p) {
Polynomial res;
for (int i = size() - p.size(); i >= 0; --i) {
res[i] = val[p.size() + i - 1] / p.back();
for (int j = 0; j < p.size(); ++j) val[i + j] -= res[i] * p[j];
}
*this = res;
normalize();
return *this;
}
Polynomial operator%=(const Polynomial& p) {
for (int i = size() - p.size(); i >= 0; --i) {
T d = val[p.size() + i - 1] / p.back();
for (int j = 0; j < p.size(); ++j) val[i + j] -= d * p[j];
}
normalize();
return *this;
}
T& operator[](int i) {
if (i >= int(val.size())) val.resize(i + 1, 0);
return val[i];
}
const T& operator[](int i) const {
return val[i];
}
int size() const {
return val.size();
}
T& back() {
return val.back();
}
const T& back() const {
return val.back();
}
typename vector<T>::iterator begin() {
return val.begin();
}
typename vector<T>::iterator end() {
return val.end();
}
Polynomial identity() const {
return Polynomial(1, 1);
}
};
template<typename T> string to_string(const T& v) {
string str;
for (const auto& i : const_cast<T&>(v)) str += to_string(i) + " ";
return str.substr(0, max(0, (int)str.size() - 1));
}
int main() {
int d;
cin >> d;
Polynomial<int> poly;
for (int i = 0; i <= d; ++i) cin >> poly[i];
poly %= Polynomial<int>(vector<int>({0, -1, 0, 1}));
cout << poly.size() - 1 << endl;
cout << to_string(poly) << endl;
}
not_522