ecnerwala's competitive programming library
#include "num/trunc_series.hpp"
| Coverage | Exec / Excl / Total | |
|---|---|---|
| Lines | 86.7% | 13 / 0 / 15 |
| Functions | 100.0% | 9 / 0 / 9 |
| Branches | 96.2% | 25 / 0 / 26 |
| Full report |
#pragma once
#include <array>
#include <cstddef>
namespace wala {
// Truncated polynomial mod x^N over num
template <typename num, int N> struct trunc_series {
std::array<num, size_t(N)> a{};
num& operator[](int i) { return a[size_t(i)]; }
const num& operator[](int i) const { return a[size_t(i)]; }
num* data() { return a.data(); }
const num* data() const { return a.data(); }
trunc_series& operator+=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] += o.a[i]; return *this; }
friend trunc_series operator+(trunc_series x, const trunc_series& y) { x += y; return x; }
trunc_series& operator-=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] -= o.a[i]; return *this; }
friend trunc_series operator-(trunc_series x, const trunc_series& y) { x -= y; return x; }
friend trunc_series operator*(const trunc_series& x, const trunc_series& y) {
trunc_series r;
for (int i = 0; i < N; i++) for (int j = 0; j < N - i; j++) r[i + j] += x[i] * y[j];
return r;
}
trunc_series& operator*=(const trunc_series& o) { return *this = *this * o; }
friend bool operator==(const trunc_series&, const trunc_series&) = default;
};
} // namespace wala
#include <array>
#include <cstddef>
#line 2 "src/num/trunc_series.hpp"
#line 5 "src/num/trunc_series.hpp"
namespace wala {
// Truncated polynomial mod x^N over num
template <typename num, int N> struct trunc_series {
std::array<num, size_t(N)> a{};
num& operator[](int i) { return a[size_t(i)]; }
const num& operator[](int i) const { return a[size_t(i)]; }
num* data() { return a.data(); }
const num* data() const { return a.data(); }
trunc_series& operator+=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] += o.a[i]; return *this; }
friend trunc_series operator+(trunc_series x, const trunc_series& y) { x += y; return x; }
trunc_series& operator-=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] -= o.a[i]; return *this; }
friend trunc_series operator-(trunc_series x, const trunc_series& y) { x -= y; return x; }
friend trunc_series operator*(const trunc_series& x, const trunc_series& y) {
trunc_series r;
for (int i = 0; i < N; i++) for (int j = 0; j < N - i; j++) r[i + j] += x[i] * y[j];
return r;
}
trunc_series& operator*=(const trunc_series& o) { return *this = *this * o; }
friend bool operator==(const trunc_series&, const trunc_series&) = default;
};
} // namespace wala
// clang-format off
// @formatter:off
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpragmas"
#pragma GCC diagnostic ignored "-Wunknown-warning-option"
#pragma GCC diagnostic ignored "-Wmisleading-indentation"
#pragma GCC diagnostic ignored "-Wmultistatement-macros"
#include <bits/stdc++.h>
// src/num/trunc_series.hpp
namespace wala{
template<typename num,int N>struct trunc_series{
std::array<num,size_t(N)>a{};
num&operator[](int i){return a[size_t(i)];}
const num&operator[](int i)const{return a[size_t(i)];}
num*data(){return a.data();}
const num*data()const{return a.data();}
trunc_series&operator+=(const trunc_series&o){for(int i=0;i<N;i++)a[i]+=o.a[i];return*this;}
friend trunc_series operator+(trunc_series x,const trunc_series&y){x+=y;return x;}
trunc_series&operator-=(const trunc_series&o){for(int i=0;i<N;i++)a[i]-=o.a[i];return*this;}
friend trunc_series operator-(trunc_series x,const trunc_series&y){x-=y;return x;}
friend trunc_series operator*(const trunc_series&x,const trunc_series&y){
trunc_series r;
for(int i=0;i<N;i++)for(int j=0;j<N-i;j++)r[i+j]+=x[i]*y[j];
return r;
}
trunc_series&operator*=(const trunc_series&o){return*this=*this*o;}
friend bool operator==(const trunc_series&,const trunc_series&)=default;
};
}
#pragma GCC diagnostic pop
// clang-format on
// @formatter:on
#pragma once
#include <array>
#include <cstddef>
namespace wala {
// Truncated polynomial mod x^N over num
template <typename num, int N> struct trunc_series {
std::array<num, size_t(N)> a{};
num& operator[](int i) { return a[size_t(i)]; }
const num& operator[](int i) const { return a[size_t(i)]; }
num* data() { return a.data(); }
const num* data() const { return a.data(); }
trunc_series& operator+=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] += o.a[i]; return *this; }
friend trunc_series operator+(trunc_series x, const trunc_series& y) { x += y; return x; }
trunc_series& operator-=(const trunc_series& o) { for (int i = 0; i < N; i++) a[i] -= o.a[i]; return *this; }
friend trunc_series operator-(trunc_series x, const trunc_series& y) { x -= y; return x; }
friend trunc_series operator*(const trunc_series& x, const trunc_series& y) {
trunc_series r;
for (int i = 0; i < N; i++) for (int j = 0; j < N - i; j++) r[i + j] += x[i] * y[j];
return r;
}
trunc_series& operator*=(const trunc_series& o) { return *this = *this * o; }
friend bool operator==(const trunc_series&, const trunc_series&) = default;
};
} // namespace wala