祝睿融

线性空间需要具备的性质 祝睿融 1. 加法交换律:对任意的 $a,b\in V$,有 $a+b=b+a$
  1. 加法结合律:对任意的 \(a,b,c\in V\),有 \((a+b)+c=a+(b+c)\)

  2. 加法单位元存在性:存在一个元素 \(0 \in V\),使得对任意的 \(a\in V\),有 \(a+0=a\)

  3. 加法逆元存在性:对任意的 \(a \in V\),存在一个元素 \(-a\in V\),使得 \(a+(-a)=0\)

  4. 数乘结合律:对任意的 \(k,l\in P,a\in V\),有 \((kl)a=k(la)\)

  5. 数乘分配律(左):对任意的 \(k\in P,a,b\in V\),有 \(k(a+b)=ka+kb\)

  6. 数乘分配律(右):对任意的 \(k,l\in P,a\in V\),有 \((k+l)a=ka+la\)

  7. 数乘单位元存在性:存在一个元素 \(1\in P\),使得对任意的 \(a\in V\),有 \(1a=a\)

线性空间需要具备的性质
祝睿融 1. 加法交换律:对任意的 $a,b\in V$,有 $a+b=b+a$
  1. 加法结合律:对任意的 \(a,b,c\in V\),有 \((a+b)+c=a+(b+c)\)

  2. 加法单位元存在性:存在一个元素 \(0 \in V\),使得对任意的 \(a\in V\),有 \(a+0=a\)

  3. 加法逆元存在性:对任意的 \(a \in V\),存在一个元素 \(-a\in V\),使得 \(a+(-a)=0\)

  4. 数乘结合律:对任意的 \(k,l\in P,a\in V\),有 \((kl)a=k(la)\)

  5. 数乘分配律(左):对任意的 \(k\in P,a,b\in V\),有 \(k(a+b)=ka+kb\)

  6. 数乘分配律(右):对任意的 \(k,l\in P,a\in V\),有 \((k+l)a=ka+la\)

  7. 数乘单位元存在性:存在一个元素 \(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);
	}
};
posted @ 2026-05-09 20:52  xubaichuan  阅读(30)  评论(0)    收藏  举报