祝睿融
线性空间需要具备的性质
祝睿融 1. 加法交换律:对任意的 $a,b\in V$,有 $a+b=b+a$-
加法结合律:对任意的 \(a,b,c\in V\),有 \((a+b)+c=a+(b+c)\)
-
加法单位元存在性:存在一个元素 \(0 \in V\),使得对任意的 \(a\in V\),有 \(a+0=a\)
-
加法逆元存在性:对任意的 \(a \in V\),存在一个元素 \(-a\in V\),使得 \(a+(-a)=0\)
-
数乘结合律:对任意的 \(k,l\in P,a\in V\),有 \((kl)a=k(la)\)
-
数乘分配律(左):对任意的 \(k\in P,a,b\in V\),有 \(k(a+b)=ka+kb\)
-
数乘分配律(右):对任意的 \(k,l\in P,a\in V\),有 \((k+l)a=ka+la\)
-
数乘单位元存在性:存在一个元素 \(1\in P\),使得对任意的 \(a\in V\),有 \(1a=a\)
线性空间需要具备的性质
祝睿融
1. 加法交换律:对任意的 $a,b\in V$,有 $a+b=b+a$
-
加法结合律:对任意的 \(a,b,c\in V\),有 \((a+b)+c=a+(b+c)\)
-
加法单位元存在性:存在一个元素 \(0 \in V\),使得对任意的 \(a\in V\),有 \(a+0=a\)
-
加法逆元存在性:对任意的 \(a \in V\),存在一个元素 \(-a\in V\),使得 \(a+(-a)=0\)
-
数乘结合律:对任意的 \(k,l\in P,a\in V\),有 \((kl)a=k(la)\)
-
数乘分配律(左):对任意的 \(k\in P,a,b\in V\),有 \(k(a+b)=ka+kb\)
-
数乘分配律(右):对任意的 \(k,l\in P,a\in V\),有 \((k+l)a=ka+la\)
-
数乘单位元存在性:存在一个元素 \(1\in P\),使得对任意的 \(a\in V\),有 \(1a=a\)
我是一级标题
我是二级标题
const int G = 3;
template<int mod>
int qpow(int a, int k) {
int res = 1;
for (; k; k >>= 1) {
if (k & 1) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
}
return res;
}
vector<int> rev;
template<int mod>
void dft(vector<int>& a) {
int n = a.size();
if (rev.size() != n) {
int k = __lg(n) - 1;
rev.resize(n);
for (int i = 1; i < n; i++)
rev[i] = rev[i >> 1] >> 1 | (i & 1) << k;
}
for (int i = 0; i < n; i++)
if (i < rev[i]) swap(a[i], a[rev[i]]);
for (int i = 1; i < n; i *= 2) {
int wn = qpow<mod>(G, (mod - 1) / 2 / i);
for (int j = 0; j < n; j += i * 2) {
int w = 1;
for (int k = 0; k < i; k++) {
int x = a[j + k], y = 1ll * w * a[j + k + i] % mod;
a[j + k] = (x + y) % mod;
a[j + k + i] = (x - y + mod) % mod;
w = 1ll * w * wn % mod;
}
}
}
}
template<int mod>
void idft(vector<int>& a) {
int n = a.size();
reverse(a.begin() + 1, a.end());
dft<mod>(a);
int inv = (1 - mod) / n + mod;
for (int i = 0; i < n; i++)
a[i] = 1ll * a[i] * inv % mod;
}
template<int mod>
struct Poly : public vector<int> {
Poly() : vector<int>() {}
explicit Poly(int n) : vector<int>(n) {}
explicit Poly(const vector<int>& a) : vector<int>(a) {}
Poly(const initializer_list<int>& a) : vector<int>(a) {}
template<class It>
Poly(It first, It last) : vector<int>(first, last) {}
Poly trunc(int k) const {
Poly a = *this;
a.resize(k);
return a;
}
friend Poly operator + (const Poly& a, const Poly& b) {
Poly c(max(a.size(), b.size()));
for (int i = 0; i < a.size(); i++) c[i] = a[i];
for (int i = 0; i < b.size(); i++) c[i] = (c[i] + b[i]) % mod;
return c;
}
friend Poly operator - (const Poly& a, const Poly& b) {
Poly c(max(a.size(), b.size()));
for (int i = 0; i < a.size(); i++) c[i] = a[i];
for (int i = 0; i < b.size(); i++) c[i] = (c[i] - b[i] + mod) % mod;
return c;
}
friend Poly operator * (Poly a, Poly b) {
if (a.size() == 0 || b.size() == 0) return Poly();
int n = 1, len = a.size() + b.size() - 1;
while (n < len) n *= 2;
a.resize(n), b.resize(n);
dft<mod>(a), dft<mod>(b);
for (int i = 0; i < n; i++)
a[i] = 1ll * a[i] * b[i] % mod;
idft<mod>(a);
a.resize(len);
return a;
}
friend Poly operator * (Poly a, int b) {
for (int i = 0; i < a.size(); i++) a[i] = 1ll * a[i] * b % mod;
return a;
}
friend Poly operator * (int a, Poly b) {
for (int i = 0; i < b.size(); i++) b[i] = 1ll * b[i] * a % mod;
return b;
}
Poly inv(int m) const {
// assert((*this)[0] != 0);
Poly x{qpow<mod>((*this)[0], mod - 2)};
for (int i = 2; i < m * 2; i *= 2)
x = (x * (Poly{2} - trunc(i) * x)).trunc(i);
return x.trunc(m);
}
friend Poly operator / (Poly a, Poly b) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int n = a.size() - b.size() + 1;
Poly q = (a.trunc(n) * b.inv(n)).trunc(n);
reverse(q.begin(), q.end());
return q;
}
Poly deriv() const {
if (this->empty()) return Poly();
Poly res(this->size() - 1);
for (int i = 0; i < this->size() - 1; i++)
res[i] = 1ll * (i + 1) * (*this)[i + 1] % mod;
return res;
}
Poly integr() const {
Poly res(this->size() + 1);
for (int i = 0; i < this->size(); i++)
res[i + 1] = 1ll * qpow<mod>(i + 1, mod - 2) * (*this)[i] % mod;
return res;
}
Poly ln(int m) const {
// assert((*this)[0] == 1);
return (deriv() * inv(m)).integr().trunc(m);
}
Poly exp(int m) const {
// assert((*this)[0] == 0);
Poly x{1};
for (int i = 2; i < m * 2; i *= 2)
x = (x * (Poly{1} - x.ln(i) + trunc(i))).trunc(i);
return x.trunc(m);
}
Poly sqrt(int m) const {
// assert((*this)[0] == 1);
Poly x{1};
int inv = (mod + 1) / 2;
for (int i = 2; i < m * 2; i *= 2)
x = (x + (trunc(i) * x.inv(i)).trunc(i)) * inv;
return x.trunc(m);
}
};

浙公网安备 33010602011771号