WA 10pts 求助
查看原帖
WA 10pts 求助
165375
Fast_Gai_Tle楼主2022/3/5 16:32
# include <cstdio>
# include <algorithm>
# include <iostream>
# include <cstring>

using namespace std;

template <class T> inline void Read (T &x) {
    x = 0; char ch = getchar ();
    while (!isdigit (ch)) ch = getchar ();
    while (isdigit (ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar ();
}

const int N = 1e5 + 5, mod = 998244353;
inline int Add (int x, int y) { return (x + y >= mod) ? x + y - mod : x + y; }
inline int Mul (int x, int y) { return 1ll * x * y % mod; }
inline int Ksm (int a, int x, int res = 1) {
    for (; x; x >>= 1, a = Mul (a, a)) if (x & 1) res = Mul (res, a);
    return res;
}

int rev[4*N], g, gi;
inline int GetRev (int n) {
    int li = 1, cnt = 0;
    while (li <= n) li <<= 1, ++cnt;
    for (register int i = 1; i < li; ++i)
	rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
    return li;
}
inline void NTT (int *a, int op, int li) {
    for (register int i = 1; i < li; ++i)
	if (i < rev[i]) swap (a[i], a[rev[i]]);
    for (register int L = 2, m = 1, wn, u, v; L <= li; L <<= 1, m <<= 1) {
	wn = Ksm (op ? g : gi, (mod - 1) / L);
	for (register int i = 0; i < li; i += L)
	    for (register int j = 0, w = 1; j < m; ++j, w = Mul (w, wn)) { u = a[i + j]; v = Mul (w, a[i + m + j]);
		a[i + j] = Add (u, v); a[i + m + j] = Add (u, mod - v);
	    }
    }
}
struct Polynome {
    int a[4*N];
    inline Polynome () { memset (a, 0, sizeof a); }
    inline int& operator [] (int x) { return a[x]; }
} fz1, fz2, F, G, H, P;
inline void GetIn (int *a, int n) {
    for (register int i = 0; i < n; ++i) Read (a[i]);
}
inline void GetOut (int *a, int n) {
    for (register int i = 0; i < n; ++i) printf ("%d ", a[i]);
    puts ("");
}
inline void GetRev (int *a, int n) {
    for (register int i = 0; i <= (n - 1) / 2; ++i) swap (a[i], a[n - 1 - i]);
}
inline void GetInv1 (int *a, int n) {
    if (n == 1) return fz1[0] = Ksm (a[0], mod - 2), void ();
    GetInv1 (a, (n + 1) / 2); int li = GetRev (2 * n - 1), invli;
    for (register int i = 0; i < n; ++i) fz2[i] = a[i];
    for (register int i = n; i < li; ++i) fz2[i] = 0;
    NTT (fz1.a, 1, li); NTT (fz2.a, 1, li);
    for (register int i = 0; i < li; ++i) 
	fz1[i] = Add (Mul (2, fz1[i]), mod - Mul (fz2[i], Mul (fz1[i], fz1[i])));
    NTT (fz1.a, 0, li); invli = Ksm (li, mod - 2);
    for (register int i = 0; i < n; ++i) fz1[i] = Mul (fz1[i], invli);
}
inline void GetInv (int *a, int n) {
    memset (fz1.a, 0, sizeof fz1.a); GetInv1 (a, n);
    for (register int i = 0; i < n; ++i) a[i] = fz1[i];
}
inline void GetDiv (int *a, int *b, int n, int m) {
    GetRev (a, n + 1); GetRev (b, m + 1);
    for (register int i = n - m + 1; i < n; ++i) a[i] = 0;
    for (register int i = n - m + 1; i < m; ++i) b[i] = 0;
    GetInv (b, n - m + 1); int li = GetRev (2 * (n - m)), invli;
    NTT (a, 1, li); NTT (b, 1, li);
    for (register int i = 0; i < li; ++i) a[i] = Mul (a[i], b[i]);
    NTT (a, 0, li); invli = Ksm (li, mod - 2);
    for (register int i = 0; i < n - m + 1; ++i) a[i] = Mul (a[i], invli);
    for (register int i = n - m + 1; i < li; ++i) a[i] = 0; GetRev (a, n - m + 1);
}

int n, m;
inline void Init () {
    Read (n); Read (m); GetIn (F.a, n + 1); GetIn (G.a, m + 1);
    for (register int i = 0; i <= n; ++i) H[i] = F[i];
    for (register int i = 0; i <= m; ++i) P[i] = G[i];
    g = 3; gi = Ksm (g, mod - 2);
}

inline void Solve () {
    GetDiv (H.a, G.a, n, m); GetOut (H.a, n - m + 1);
    int li = GetRev (n + m), invli;
    for (register int i = m; i < li; ++i) H[i] = P[i] = F[i] = 0;
    NTT (F.a, 1, li); NTT (P.a, 1, li); NTT (H.a, 1, li);
    for (register int i = 0; i < li; ++i) F[i] = Add (F[i], mod - Mul (P[i], H[i]));
    NTT (F.a, 0, li); invli = Ksm (li, mod - 2);
    for (register int i = 0; i < li; ++i) F[i] = Mul (F[i], invli);
    GetOut (F.a, m);
}

int main () {
    Init (); Solve ();
    return 0;
}
2022/3/5 16:32
加载中...