__TEST

谔谔,瞎配了配这博客算是搭起来了。

aha,不知道写些什么。

qwq......

1 2 w x 🐢

1 2 w x 🐢

1 2 w x 🐢

1 2 w x 🐢

1 2 w x 🐢
1 2 w x 🐢
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

#define fir first
#define sec second
#define mpr make_pair

#define vv vector
#define eb emplace_back

#define Fr(i, l, r) for (int i = l; i <= r; ++i)
#define Rf(i, r, l) for (int i = r; i >= l; --i)

template<typename T> int Max(T& x, T y) { return y > x ? (x = y, 2) : x == y; }
template<typename T> int Min(T& x, T y) { return y < x ? (x = y, 2) : x == y; }

template<typename T> void Read(T& x) {
    x = 0; char ch = getchar(); bool f = false;
    while (!isdigit(ch)) f = f || ch == '-', ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
    if (f) x = -x;
}

template<typename T> void Write(T x, char ch = '\n') {
    static int tp, sk[70];
    if (x < 0) putchar('-'), x = -x;
    do { sk[++tp] = x % 10, x /= 10; } while (x);
    while (tp) putchar(sk[tp--] + '0');
    putchar(ch);
}

const long long MD = 998244353;

ll qpow(ll a, ll b) {
	ll res = 1;
	for (; b; b >>= 1, a = a * a % MD) if (b & 1) res = res * a % MD;
	return res;
}

ll inv(ll x) { return qpow(x, MD - 2); }

using Poly = vector<ll>;
#define lg(x) ((x) == 0 ? -1 : __lg(x))
#define Size(x) int(x.size())

namespace NTT_ns {
	const long long G = 3, invG = inv(G);

	void Root(ll x = MD) {
		ll _tp1 = x - 1, _tp2 = 0;
		while (_tp1 % 2 == 0) _tp1 >>= 1, ++_tp2;
		fprintf(stderr, "MD = %lld * 2 ^ %lld + 1\n", _tp1, _tp2);
		vector<ll> p; _tp1 = x - 1;
		for (ll i = 2; i * i <= _tp1; ++i) if (_tp1 % i == 0) {
			p.emplace_back(i);
			while (_tp1 % i == 0) _tp1 /= i;
		}
		if (_tp1 != 1) p.emplace_back(_tp1);
		for (ll r = 1; r < x; ++r) {
			int cnt = 0;
			for (auto& i : p) if (qpow(r, (x - 1) / i) == 1) ++cnt;
			if (cnt == 0) { fprintf(stderr, "%lld\n", r); break; }
		}
	}

	vector<int> rev;
	void NTT(ll* F, int len, int sgn) {
		rev.resize(len);
		for (int i = 1; i < len; ++i) {
			rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (len >> 1));
			if (i < rev[i]) swap(F[i], F[rev[i]]);
		}
		for (int tmp = 1; tmp < len; tmp <<= 1) {
			ll w1 = qpow(sgn ? G : invG, (MD - 1) / (tmp << 1));
			for (int i = 0; i < len; i += tmp << 1) {
				for (ll j = 0, w = 1; j < tmp; ++j, w = w * w1 % MD) {
					ll x = F[i + j], y = F[i + j + tmp] * w % MD;
					F[i + j] = (x + y) % MD, F[i + j + tmp] = (x - y + MD) % MD;
				}
			}
		}
		if (sgn == 0) {
			ll inv_len = inv(len);
			for (int i = 0; i < len; ++i) F[i] = F[i] * inv_len % MD;
		}
	}

	vector<ll> Iv(2, 1), jc(1, 1), ijc(1, 1);
	void Add_Inv(int len) {
		Iv[0] = 0, Iv[1] = 1, len += 10; if (len < Size(Iv)) return;
		int i = Size(Iv); Iv.resize(len);
		while (i < len) Iv[i] = (MD - MD / i * Iv[MD % i] % MD) % MD, ++i;
	}

	void Add_Fac(int len) {
		Add_Inv(len), len += 10; if (len < Size(jc)) return;
		int i = Size(jc); jc.resize(len), ijc.resize(len);
		for (; i < len; ++i) jc[i] = jc[i - 1] * i % MD, ijc[i] = ijc[i - 1] * Iv[i] % MD;
	}

	namespace Tools {
		ll Inv(int x) {
			return Add_Inv(x), Iv[x];
		}

		ll fac(int x) {
			return Add_Fac(x), jc[x];
		}

		ll ifac(int x) {
			return Add_Fac(x), ijc[x];
		}

		ll Binom(int n, int m) {
			Add_Fac(max(n, m));
			return n < m ? 0 : jc[n] * ijc[m] % MD * ijc[n - m] % MD;
		}
	}
}

Poly operator * (Poly F, Poly G) {
	int siz = Size(F) + Size(G) - 1, len = 1 << (lg(siz - 1) + 1);
	if (siz <= 300 || min(Size(F), Size(G)) <= 20) {
		Poly H(siz);
		for (int i = Size(F) - 1; ~i; --i) for (int j = Size(G) - 1; ~j; --j) {
			H[i + j] = (H[i + j] + F[i] * G[j]) % MD;
		}
		return H;
	}
	using NTT_ns::NTT; F.resize(len), G.resize(len);
	NTT(F.data(), len, 1), NTT(G.data(), len, 1);
	for (int i = 0; i < len; ++i) F[i] = F[i] * G[i] % MD;
	return NTT(F.data(), len, 0), F.resize(siz), F;
}

Poly operator + (Poly F, Poly G) {
	int siz = max(Size(F), Size(G)); F.resize(siz), G.resize(siz);
	for (int i = 0; i < siz; ++i) F[i] = (F[i] + G[i]) % MD;
	return F;
}

Poly operator - (Poly F, Poly G) {
	int siz = max(Size(F), Size(G)); F.resize(siz), G.resize(siz);
	for (int i = 0; i < siz; ++i) F[i] = (F[i] - G[i] + MD) % MD;
	return F;
}

Poly lsh(Poly F, int k) {
	F.resize(Size(F) + k);
	for (int i = Size(F) - 1; i >= k; --i) F[i] = F[i - k];
	for (int i = 0; i < k; ++i) F[i] = 0;
	return F;
}

Poly rsh(Poly F, int k) {
	int siz = Size(F) - k;
	for (int i = 0; i < siz; ++i) F[i] = F[i + k];
	return F.resize(siz), F;
}

Poly cut(Poly F, int len) {
	return F.resize(len), F;
}

Poly der(Poly F) {
	int siz = Size(F) - 1;
	for (int i = 0; i < siz; ++i) F[i] = F[i + 1] * (i + 1) % MD;
	return F.pop_back(), F;
}

Poly inte(Poly F) {
	F.emplace_back(0);
	for (int i = Size(F) - 1; ~i; --i) F[i] = F[i - 1] * NTT_ns::Tools::Inv(i) % MD;
	return F[0] = 0, F;
}

Poly inv(Poly F) {
	int siz = Size(F); Poly G{inv(F[0])};
	for (int i = 2; (i >> 1) < siz; i <<= 1) {
		G = G + G - G * G * cut(F, i), G.resize(i);
	}
	return G.resize(siz), G;
}

Poly ln(Poly F) {
	return cut(inte(cut(der(F) * inv(F), Size(F))), Size(F));
}

Poly Exp(Poly F) {
	int siz = Size(F); Poly G{1};
	for (int i = 2; (i >> 1) < siz; i <<= 1) {
		G = G * (Poly{1} - ln(cut(G, i)) + cut(F, i)), G.resize(i);
	}
	return G.resize(siz), G;
}

int main() {
	// TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST
	return 0;
}

\(F(i)=F(i-1)+F(i-2)\hspace{-2020px} ------| password = qqvkhxzzlkhuiyojvbbqylkzeeekwq |------\)

Ayjisdn goiwen opanet citnenee

posted @ 2022-04-20 16:06  AWR  阅读(80)  评论(0)    收藏  举报