cp-book

ecnerwala's competitive programming library

View the Project on GitHub ecnerwala/cp-book

:warning: #include "num/trunc_series.hpp"

View this file on GitHub · Last update: 2026-08-19 23:07:21-07:00

Required by

Code

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
Back to top page