QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#200512#622. 多项式多点求值NOI_AK_ME0 70ms96056kbC++2317.8kb2023-10-04 17:14:142023-10-04 17:14:14

Judging History

你现在查看的是最新测评结果

  • [2023-10-04 17:14:14]
  • 评测
  • 测评结果:0
  • 用时:70ms
  • 内存:96056kb
  • [2023-10-04 17:14:14]
  • 提交

answer

#include<bits/stdc++.h>
using u32 = unsigned;
using u64 = unsigned long long;
using u128 = __uint128_t;
u32 output;


constexpr u32 N = 2e6 + 5;
constexpr u32 mod = 998244353;
constexpr u32 mod2 = mod * 2;

inline u64 getdiv(u64 x) {
	constexpr u64 base = (-1ull) / mod;
	return u64((u128) x * base >> 64);
}

inline u32 getmod(u64 x) {
	return (u32) x - mod * u32(getdiv(x));
}

struct istream
{
	static const u32 size = 1 << 22;
	char buf[size], *vin;
	inline istream()
	{
		fread(buf,1,size,stdin);
		vin = buf - 1;
	}
	inline istream& operator >> (u32 & x)
	{
		for(x = *++vin & 15;isdigit(*++vin);) x = x * 10 + (*vin & 15);
		return * this;
	}
} cin;
struct ostream {
	static const u32 size = 1 << 23;
	char buf[size], *vout;
	unsigned map[10000];
	inline ostream() {
		for(u32 i = 0;i < 10000;++i) {
			map[i] = (i % 10 + 48) << 24 | (i / 10 % 10 + 48) << 16 | (i / 100 % 10 + 48) << 8 | (i / 1000 + 48);
		}
		vout = buf + size;
	}
	inline ~ ostream()
	{ fwrite(vout,1,buf + size - vout,stdout); }
	inline ostream& operator << (u32 x) {
		if(x) {
			for(;x >= 1000;x /= 10000) *--(unsigned*&)vout = map[x % 10000];
			while(x) *--vout = x % 10 + 48, x /= 10;
		} else *--vout = 48;
		return * this;
	}
	inline ostream& operator << (char x)
	{
		*--vout = x;
		return * this;
	}
} cout;



struct multi_integer {
	u32 val, ival;
	inline multi_integer() {}
	inline explicit multi_integer(u32 v) {
		val = v;
		ival = ((u64) v << 32) / mod;
	}
	__attribute((always_inline)) u32 operator * (u32 x) const {
		return val * x - u32((u64) x * ival >> 32) * mod;
	}
} wn[N << 1], iwn[N << 1];
u32 lim, shift;

u32 dfta[N], rev[N], w[N];


inline u32 get_index(u32 x, u32 lim) {
	static u32 bak[50];
	int i = 1, lg = std::__lg(lim);
	*bak = x;
	for(int i = 1;i < lg;++i) bak[i] = (u64) bak[i - 1] * bak[i - 1] % mod;
	int res = 0;
	for(int i = lg - 1;i >= 0;--i) if((u64) bak[i] * w[res << i & lim - 1] % mod != 1) 
		res += 1 << lg - 1 - i;
	return res ? lim - res : 0;
}

__attribute((always_inline)) u32 norm1(u32 x) {
	return x >= mod ? x - mod : x;
}
static constexpr u32 map[4] = {
	0, mod, mod2, mod + mod2
};
inline u32 norm2(u32 x) {
	return x - map[x >> 30];
}
inline u32 norm2_lazy(u32 x) {
	return x - map[x >> 30];
}
inline u32 norm2_ex(u32 x) {
	return x - map[x >> 30];
}
inline u32 pow(u32 a, u32 b, u32 ans = 1) {
	for(;b;b >>= 1, a = (u64) a * a % mod) if(b & 1)
		ans = (u64) ans * a % mod;
	return ans;
}

inline u32 get(u32 x) {
	return ((u64) x << 32) / mod;
}
inline void base_init(u32 len) {
	u32 N = 1;
	for(;N < len;)
		N <<= 1;
	const u32 mid = N >> 1;
	const u32 w = pow(3, mod / N);
	const u32 iw = pow((mod + 1) / 3, mod / N);
	wn[mid] = multi_integer(1);
	iwn[mid] = multi_integer(1);
	for(int i = 1;i < mid;++i) {
		wn[mid + i] = multi_integer((u64) wn[mid + i - 1].val * w % mod);
		iwn[mid + i] = multi_integer((u64) iwn[mid + i - 1].val * iw % mod);
	}
	for(int i = mid - 1;i >= 0;--i) {
		wn[i] = wn[i << 1];
		iwn[i] = iwn[i << 1];
	}
}
inline void init(u32 len) {
	lim = len;
	shift = std::__lg(lim);
}
inline void safe_init(u32 len) {
	lim = 1, shift = 0;
	for(;lim < len;)
		lim <<= 1, ++ shift;
}
inline u32 multi(u32 w, u32 idx) {
	return wn[idx] * w;
}

inline void dft(u32 * a) {
#define trans(a, b, idx) \
	{ \
		const u32 A = norm2(a + b);\
		b = wn[idx] * (a + mod2 - b),\
		a = A; \
	}
#define trans2(a, b) \
	{ \
		const u32 A = norm2(a + b);\
		b = norm2(a + mod2 - b), \
		a = A; \
	}

	for(int mid = lim >> 1;mid != 4;mid >>= 1) {
		for(int j = 0;j != lim;j += mid + mid) {
			for(int k = 0;k != mid;k += 4) {
				const u32 A0 = wn[mid + k + 0] * (a[j + k + 0] + mod2 - a[mid + j + k + 0]);
				const u32 A1 = wn[mid + k + 1] * (a[j + k + 1] + mod2 - a[mid + j + k + 1]);
				const u32 A2 = wn[mid + k + 2] * (a[j + k + 2] + mod2 - a[mid + j + k + 2]);
				const u32 A3 = wn[mid + k + 3] * (a[j + k + 3] + mod2 - a[mid + j + k + 3]);
				a[j + k + 0] = norm2(a[j + k + 0] + a[mid + j + k + 0]);
				a[j + k + 1] = norm2(a[j + k + 1] + a[mid + j + k + 1]);
				a[j + k + 2] = norm2(a[j + k + 2] + a[mid + j + k + 2]);
				a[j + k + 3] = norm2(a[j + k + 3] + a[mid + j + k + 3]);
				a[mid + j + k + 0] = A0;
				a[mid + j + k + 1] = A1;
				a[mid + j + k + 2] = A2;
				a[mid + j + k + 3] = A3;
			}
		}
	}
	for(int j = 0;j != lim;j += 8) {
		trans2(a[j + 0], a[j + 4]);
		trans(a[j + 1], a[j + 5], 5);
		trans(a[j + 2], a[j + 6], 6);
		trans(a[j + 3], a[j + 7], 7);

		trans2(a[j + 0], a[j + 2]);
		trans(a[j + 1], a[j + 3], 3);
		trans2(a[j + 4], a[j + 6]);
		trans(a[j + 5], a[j + 7], 3);

		trans2(a[j + 0], a[j + 1]);
		trans2(a[j + 2], a[j + 3]);
		trans2(a[j + 4], a[j + 5]);
		trans2(a[j + 6], a[j + 7]);
	}
#undef trans
#undef trans2
}


inline void dft_last(u32 * a) {
	int mid = lim >> 1;

	{
		int k = 0, limit = mid / 2 + 1;
		for(;k + 1 != limit;k += 4) {
			a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
			a[mid + k + 1] = wn[mid + k + 1] * a[k + 1];
			a[mid + k + 2] = wn[mid + k + 2] * a[k + 2];
			a[mid + k + 3] = wn[mid + k + 3] * a[k + 3];
		}
		a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
	}

	mid >>= 1;

	const u32 A0 = wn[mid + 0] * (a[0] + mod2 - a[mid + 0]);
	a[0] = norm2(a[0] + a[mid + 0]), a[mid + 0] = A0;

	{
		int k = 1;
		for(;k + 3 != mid;k += 4) {
			a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
			a[mid + k + 1] = wn[mid + k + 1] * a[k + 1];
			a[mid + k + 2] = wn[mid + k + 2] * a[k + 2];
			a[mid + k + 3] = wn[mid + k + 3] * a[k + 3];
		}
		for(;k != mid;k += 1) a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
	}

	a += mid + mid;

	const u32 A1 = wn[mid + 0] * (a[0] + mod2 - a[mid + 0]);
	a[0] = norm2(a[0] + a[mid + 0]), a[mid + 0] = A1;

	{
		int k = 1;
		for(;k + 3 != mid;k += 4) {
			a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
			a[mid + k + 1] = wn[mid + k + 1] * a[k + 1];
			a[mid + k + 2] = wn[mid + k + 2] * a[k + 2];
			a[mid + k + 3] = wn[mid + k + 3] * a[k + 3];
		}
		for(;k != mid;k += 1) a[mid + k + 0] = wn[mid + k + 0] * a[k + 0];
	}

	init(lim >> 2);
	dft(a - lim);
	dft(a);
	dft(a + lim);
}

inline u32 div_lim(u32 x) {
	return (x + u64(-x & (lim - 1)) * mod) >> shift;
}
inline void base_idft(u32 * a) {
#define trans(a, b, idx) \
	{ \
		u32 A = norm2_lazy(a), B = iwn[idx] * b; \
		a = A + B; \
		b = A + mod2 - B; \
	}
#define trans2(a, b) \
	{ \
		const u32 A = norm2(a), B = norm2(b); \
		a = A + B; \
		b = A + mod2 - B; \
	}

	for(int j = 0;j != lim;j += 8) {
		trans2(a[j + 0], a[j + 1]);
		trans2(a[j + 2], a[j + 3]);
		trans2(a[j + 4], a[j + 5]);
		trans2(a[j + 6], a[j + 7]);

		trans2(a[j + 0], a[j + 2]);
		trans(a[j + 1], a[j + 3], 3);
		trans2(a[j + 4], a[j + 6]);
		trans(a[j + 5], a[j + 7], 3);

		trans2(a[j + 0], a[j + 4]);
		trans(a[j + 1], a[j + 5], 5);
		trans(a[j + 2], a[j + 6], 6);
		trans(a[j + 3], a[j + 7], 7);
	}
	for(int mid = 8;mid != lim;mid <<= 1) {
		for(int j = 0;j != lim;j += mid + mid) {
			for(int k = 0;k != mid;k += 4) {
				const u32 A0 = norm2_lazy(a[j + k + 0]), B0 = iwn[mid + k + 0] * a[mid + j + k + 0];
				const u32 A1 = norm2_lazy(a[j + k + 1]), B1 = iwn[mid + k + 1] * a[mid + j + k + 1];
				const u32 A2 = norm2_lazy(a[j + k + 2]), B2 = iwn[mid + k + 2] * a[mid + j + k + 2];
				const u32 A3 = norm2_lazy(a[j + k + 3]), B3 = iwn[mid + k + 3] * a[mid + j + k + 3];
				a[mid + j + k + 0] = A0 + mod2 - B0; 
				a[mid + j + k + 1] = A1 + mod2 - B1; 
				a[mid + j + k + 2] = A2 + mod2 - B2; 
				a[mid + j + k + 3] = A3 + mod2 - B3; 
				a[j + k + 0] = A0 + B0;
				a[j + k + 1] = A1 + B1;
				a[j + k + 2] = A2 + B2;
				a[j + k + 3] = A3 + B3;
			}
		}
	}
#undef trans
#undef trans2
}
inline void idft_last_copy(u32 * a, u32 * res) {

#define trans(a, b, idx) \
		{ \
			u32 A = norm2_lazy(a), B = iwn[idx] * b; \
			a = A + B; \
			b = A + mod2 - B; \
		}
#define trans2(a, b) \
		{ \
			const u32 A = norm2(a), B = norm2(b); \
			a = A + B; \
			b = A + mod2 - B; \
		}
	for(int j = 0;j != lim;j += 8) {
		trans2(a[j + 0], a[j + 1]);
		trans2(a[j + 2], a[j + 3]);
		trans2(a[j + 4], a[j + 5]);
		trans2(a[j + 6], a[j + 7]);

		trans2(a[j + 0], a[j + 2]);
		trans(a[j + 1], a[j + 3], 3);
		trans2(a[j + 4], a[j + 6]);
		trans(a[j + 5], a[j + 7], 3);

		trans2(a[j + 0], a[j + 4]);
		trans(a[j + 1], a[j + 5], 5);
		trans(a[j + 2], a[j + 6], 6);
		trans(a[j + 3], a[j + 7], 7);
	}
	for(int mid = 8;mid < lim >> 2;mid <<= 1) {
		for(int j = 0;j != lim;j += mid + mid) {
			for(int k = 0;k != mid;k += 4) {
				const u32 A0 = norm2_lazy(a[j + k + 0]), B0 = iwn[mid + k + 0] * a[mid + j + k + 0];
				const u32 A1 = norm2_lazy(a[j + k + 1]), B1 = iwn[mid + k + 1] * a[mid + j + k + 1];
				const u32 A2 = norm2_lazy(a[j + k + 2]), B2 = iwn[mid + k + 2] * a[mid + j + k + 2];
				const u32 A3 = norm2_lazy(a[j + k + 3]), B3 = iwn[mid + k + 3] * a[mid + j + k + 3];
				a[mid + j + k + 0] = A0 + mod2 - B0; 
				a[mid + j + k + 1] = A1 + mod2 - B1; 
				a[mid + j + k + 2] = A2 + mod2 - B2; 
				a[mid + j + k + 3] = A3 + mod2 - B3; 
				a[j + k + 0] = A0 + B0;
				a[j + k + 1] = A1 + B1;
				a[j + k + 2] = A2 + B2;
				a[j + k + 3] = A3 + B3;
			}
		}
	}
	int mid = lim >> 2;
	for(int j = 0;j != lim;j += mid + mid) {
		for(int k = 0;k != mid;k += 4) {
			const u32 A0 = norm2_lazy(a[j + k + 0]), B0 = iwn[mid + k + 0] * a[mid + j + k + 0];
			const u32 A1 = norm2_lazy(a[j + k + 1]), B1 = iwn[mid + k + 1] * a[mid + j + k + 1];
			const u32 A2 = norm2_lazy(a[j + k + 2]), B2 = iwn[mid + k + 2] * a[mid + j + k + 2];
			const u32 A3 = norm2_lazy(a[j + k + 3]), B3 = iwn[mid + k + 3] * a[mid + j + k + 3];
			a[mid + j + k + 0] = A0 + mod2 - B0; 
			a[mid + j + k + 1] = A1 + mod2 - B1; 
			a[mid + j + k + 2] = A2 + mod2 - B2; 
			a[mid + j + k + 3] = A3 + mod2 - B3; 
		}
	}
	res -= mid;
	mid <<= 1;
	for(int k = mid >> 1;k != mid;k += 4) {
		const u32 A0 = norm2_lazy(a[k + 0]), B0 = iwn[mid + k + 0] * a[mid + k + 0];
		const u32 A1 = norm2_lazy(a[k + 1]), B1 = iwn[mid + k + 1] * a[mid + k + 1];
		const u32 A2 = norm2_lazy(a[k + 2]), B2 = iwn[mid + k + 2] * a[mid + k + 2];
		const u32 A3 = norm2_lazy(a[k + 3]), B3 = iwn[mid + k + 3] * a[mid + k + 3];
		res[k + 0] = norm2_ex(A0 + mod2 - B0);
		res[k + 1] = norm2_ex(A1 + mod2 - B1);
		res[k + 2] = norm2_ex(A2 + mod2 - B2);
		res[k + 3] = norm2_ex(A3 + mod2 - B3);
	}
#undef trans
#undef trans2
}

inline void idft(u32 * a) {
	base_idft(a);
	for(int i = 0;i != lim;++i)
		a[i] = div_lim(a[i]);
}

inline void fill(u32 * a, const u32 * b, u32 len)
{
	memcpy(a, b, len << 2);
	memset(a + len, 0, (lim - len) << 2);
}
inline void sub(u32 & x) { x = x ? x - 1 : mod - 1; }
static const u32 brute_limit = 1000;
u32 n, m, M;
u32 a[N << 1], b[N << 1], b2[N], b4[N], c[N << 1], d[N << 1];
u32 ans[N];
u32 o[9][N];
u32 val[9][N << 2];
u32 sgt[9][N << 2];

u32 power_b[N], ex_b[N];
u32 dft_val[N];

inline void prod(u32* a, const u32* b, const u32* c) {
	for(int i = 0;i < lim;i += 4) {
		a[i + 0] = getmod((u64) b[i + 0] * c[i + 0]);
		a[i + 1] = getmod((u64) b[i + 1] * c[i + 1]);
		a[i + 2] = getmod((u64) b[i + 2] * c[i + 2]);
		a[i + 3] = getmod((u64) b[i + 3] * c[i + 3]);
	}
}
inline void solve(u32 dep, u32 l, u32 r, bool good) {

	if(l >= m) {
		std::fill(val[dep] + l * 4, val[dep] + r * 4, 1);
		return ;
	}

	u32 n = r - l;

	static u32 t[N];
	if(n < brute_limit) {
		u32 * x = o[dep] + l;
		for(int i = l;i < r;i += 4) {
			const u32 v0 = b[i + 0] ? mod - b[i + 0] : 0;
			const u32 v1 = b[i + 1] ? mod - b[i + 1] : 0;
			const u32 v2 = b[i + 2] ? mod - b[i + 2] : 0;
			const u32 v3 = b[i + 3] ? mod - b[i + 3] : 0;

			const u32 v01 = (u64) v0 * v1 % mod;
			const u32 v23 = (u64) v2 * v3 % mod;

			const u32 a4 = (u64) v01 * v23 % mod;
			const u32 a3 = ((u64) v01 * (v2 + v3) + (u64) v23 * (v0 + v1)) % mod;
			const u32 a2 = (v01 + v23 + (u64) (v0 + v1) * (v2 + v3)) % mod;
			const u32 a1 = (v0 + v1 + v2 + v3) % mod;

			for(int j = i - l + 3;j > 3;--j) {
				x[j] = ((u64) x[j - 4] * a4 + (u64) x[j - 3] * a3 + (u64) x[j - 2] * a2 + (u64) x[j - 1] * a1 + x[j]) % mod;
			}
			x[3] = (a4 + (u64) x[0] * a3 + (u64) x[1] * a2 + (u64) x[2] * a1 + x[3]) % mod;
			x[2] = (a3 + (u64) x[0] * a2 + (u64) x[1] * a1 + x[2]) % mod;
			x[1] = (a2 + (u64) x[0] * a1 + x[1]) % mod;
			x[0] = norm1(x[0] + a1);
		}

	} else {
		u32 mid0 = (l * 3 + r * 1) >> 2;
		u32 mid1 = (l * 2 + r * 2) >> 2;
		u32 mid2 = (l * 1 + r * 3) >> 2;
		solve(dep + 1, l, mid0, 1);
		solve(dep + 1, mid0, mid1, 1);
		solve(dep + 1, mid1, mid2, 1);
		solve(dep + 1, mid2, r, 1);
		init(n);
		u32* da = val[dep + 1] + l * 4;
		u32* db = val[dep + 1] + mid0 * 4;
		u32* dc = val[dep + 1] + mid1 * 4;
		u32* dd = val[dep + 1] + mid2 * 4;
		if(mid0 >= m) {
			memcpy(dft_val, da, lim << 2);
			memcpy(o[dep] + l, o[dep + 1] + l, lim);
		} else {
			prod(sgt[dep] + l + l, da, db);
			prod(sgt[dep] + mid1 + mid1, dc, dd);
			prod(dft_val, sgt[dep] + l + l, sgt[dep] + mid1 + mid1);
			memcpy(t, dft_val, lim << 2);
			idft(t);
			memcpy(o[dep] + l, t + 1, (lim - 1) << 2);
			sub(o[dep][l + n - 1] = t[0]);
		}
	}

	if(good) {
		init(n << 2);
		memcpy(val[dep] + l * 4 + 1, o[dep] + l, n << 2);
		val[dep][l * 4] = 1;
		if(n >= brute_limit) {
			dft_last(val[dep] + l * 4);
			memcpy(val[dep] + l * 4, dft_val, n << 2);
		} else {
			dft(val[dep] + l * 4);
		}
	}
}
inline void getans(u32 dep, u32 l, u32 r, u32 * a, u32 * cur, bool good, u32 inv) {

	if(l >= m) return ;

	u32 n = r - l;
	if(n < brute_limit) {
		static u32 g[N], B[N];
		memcpy(B + 1, o[dep] + l, (n - 1) << 2);
		*B = 1;
		for(int i = 0;i < n;++i) {
			a[i] = norm1(a[i]);
			u64 sum = 0;
			int j = 0;
			for(;j + 3 <= i;j += 4) {
				sum +=
					(u64) a[j + 0] * B[i - j - 0] +
					(u64) a[j + 1] * B[i - j - 1] +
					(u64) a[j + 2] * B[i - j - 2] +
					(u64) a[j + 3] * B[i - j - 3] ;
			}
			for(;j <= i;++j) sum += (u64) a[j] * B[i - j];
			g[i] = sum % mod;
		}
		for(int i = l;i < r;++i) {
			u32 & x = ans[i];
			const u32 b1 = b[i];
			const u32 b2 = :: b2[i];
			const u32 b3 = (u64) b2 * b1 % mod;
			const u32 b4 = :: b4[i];
			x = ((u64) x * b4 + (u64) g[0 + 0] * b3 + (u64) g[0 + 1] * b2 + (u64) g[0 + 2] * b1 + g[0 + 3]) % mod;
			x = ((u64) x * b4 + (u64) g[4 + 0] * b3 + (u64) g[4 + 1] * b2 + (u64) g[4 + 2] * b1 + g[4 + 3]) % mod;
			if(n != 8) {
				x = ((u64) x * b4 + (u64) g[8 + 0] * b3 + (u64) g[8 + 1] * b2 + (u64) g[8 + 2] * b1 + g[8 + 3]) % mod;
				x = ((u64) x * b4 + (u64) g[12 + 0] * b3 + (u64) g[12 + 1] * b2 + (u64) g[12 + 2] * b1 + g[12 + 3]) % mod;
			}
			x = (u64) x * inv % mod;
		}
		return ;
	}
	static u32 c[N];
	u32 mid0 = (l * 3 + r * 1) >> 2;

	if(mid0 >= m) {
		for(int i = 0;i != n / 4;++i) a[n + i] = a[n / 4 * 3 + i];
		getans(dep + 1, l, mid0, a + n, cur + n, 1, inv);
		return ;
	}

	u32 mid1 = (l * 2 + r * 2) >> 2;
	u32 mid2 = (l * 1 + r * 3) >> 2;

	u32* da = val[dep + 1] + l * 4;
	u32* db = val[dep + 1] + mid0 * 4;
	u32* dc = val[dep + 1] + mid1 * 4;
	u32* dd = val[dep + 1] + mid2 * 4;
	u32* dab = sgt[dep] + l * 2;
	u32* dcd = sgt[dep] + mid1 * 2;

	init(n);
	dft(a);

	prod(cur, a, dcd);
	prod(c, cur, db);

	inv = div_lim(inv);
	idft_last_copy(c, a + n);
	getans(dep + 1, l, mid0, a + n, cur + n, 1, inv);

	if(mid0 >= m) return ;
	init(n);
	prod(c, cur, da);
	idft_last_copy(c, a + n);
	getans(dep + 1, mid0, mid1, a + n, cur + n, 1, inv);

	if(mid1 >= m) return ;
	init(n);
	prod(cur, a, dab);
	prod(c, cur, dd);
	idft_last_copy(c, a + n);
	getans(dep + 1, mid1, mid2, a + n, cur + n, 1, inv);

	if(mid2 >= m) return ;
	init(n);
	prod(c, cur, dc);
	idft_last_copy(c, a + n);
	getans(dep + 1, mid2, r, a + n, cur + n, 1, inv);
}

inline void init_inv(const u32 * a, u32 * res, int n) {
	static u32 pre[N];
	*pre = *a;
	for(int i = 1;i != n;++i) {
		pre[i] = (u64) pre[i - 1] * a[i] % mod;
	}
	u32&all_inv = res[0] = pow(pre[n - 1], mod - 2);
	for(int i = n - 1;i;--i) {
		res[i] = (u64) all_inv * pre[i - 1] % mod;
		all_inv = (u64) all_inv * a[i] % mod;
	}
}

inline void naive() {
	for(u32 i = m - 1;~i;--i) {
		u32 x = b[i], &ret = ans[i] = 0;
		for(int i = n - 1;~i;--i) {
			ret = ((u64) ret * x + a[i]) % mod;
		}
	}
}

int main() {
	cin >> n >> m;

	for(M = 1;M < n || M < m;) M <<= 1;
	const int max_ask = 1 << 18;
	if(M > max_ask)
		M = max_ask;

	base_init(M);

	for(u32 i = 0;i < n;++i) {
		cin >> a[i];
	}
	for(u32 i = 0;i < m;++i) {
		cin >> b[i];
	}
	if((u64) n * m < 50) naive();
	else {
		init(M);
		fill(dfta, a, n);
		dft(dfta);
		for(int i = 1;i < lim;++i) rev[i] = rev[i >> 1] >> 1 | i % 2 * lim / 2;
		const int GG = pow(3, mod / lim);
		for(int i = 0, multi = 1;i < lim;++i) {
			a[rev[lim - i]] = (u64) dfta[rev[i]] * multi % mod;
			w[i] = multi;
			multi = (u64) multi * GG % mod;
		}
		*a = *dfta;

		u32 res = 0;
		for(int i = 0;i < m;++i) {
			power_b[i] = b[i];
		}
		static u32 og[N];
		init(M), lim = m;

		prod(power_b, power_b, power_b);
		memcpy(b2, power_b, m << 2);
		prod(power_b, power_b, power_b);
		memcpy(b4, power_b, m << 2);

		for(int i = 2;i < shift;++i) {
			prod(power_b, power_b, power_b);
		}
		init(M);
		for(int i = m;i < lim;++i) {
			power_b[i] = 1;
		}
		for(int i = 0;i < lim;++i) {
			power_b[i] = norm1(norm2(power_b[i] + mod - 1));
			if(power_b[i] == 0) {
				og[i] = b[i];
				b[i] = 3;
			}
		}

		solve(0, 0, M, 0);
		init(M);
		init_inv(dft_val, d, M);
		prod(a, d, a);
		idft(a);
		for(u32 i = 0;i < M;++i) a[i] = norm2(a[i]);
		static u32 cur[N << 1];
		getans(0, 0, M, a, cur, 0, 1);
		for(int i = 0;i < m;++i) {
			if(power_b[i]) {
				ans[i] = (u64) ans[i] * (mod - power_b[i]) % mod;
			} else {
				ans[i] = norm1(dfta[rev[get_index(og[i], M)]]);
			}
		}
	}
	for(u32 i = m - 1;~i;--i) {
		cout << '\n' << ans[i];
	}
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 36188kb

input:

100 94
575336069 33153864 90977269 80162592 25195235 334936051 108161572 14050526 356949084 797375084 805865808 286113858 995555121 938794582 458465004 379862532 563357556 293989886 273730531 13531923 113366106 126368162 405344025 443053020 475686818 734878619 338356543 661401660 834651229 527993675...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

result:

wrong answer 1st numbers differ - expected: '940122667', found: '0'

Test #2:

score: 0
Wrong Answer
time: 0ms
memory: 54716kb

input:

5000 4999
410683245 925831211 726803342 144364185 955318244 291646122 334752751 893945905 484134283 203760731 533867267 813509277 491860093 413174124 584582617 594704162 976489328 978500071 196938934 628117769 169796671 858963950 562124570 582491326 647830593 238623335 20782490 674939336 656529076 2...

output:

500745129
415118656
195232028
21559911
679686008
514306542
577083706
732813208
617371409
5124940
803823634
132437498
145748576
959371550
746661781
653953533
434337142
442470263
658927843
369973645
123127901
739188372
996509211
701429880
250349818
378115262
479696156
316106562
701704887
365697882
357...

result:

wrong answer 1st numbers differ - expected: '683038054', found: '500745129'

Test #3:

score: 0
Wrong Answer
time: 15ms
memory: 63412kb

input:

30000 29995
536696866 881441742 356233606 594487396 991820796 695996817 7219464 149265950 843761437 329761701 260625152 80366362 598729314 133794090 12808683 67477659 320740422 878134577 879383179 940923483 660160621 18082378 886078389 524050341 35092018 137623841 988429688 258507355 138475726 75726...

output:

766074088
406617125
23236322
118158509
666190988
299818350
543072286
92494922
543075963
317228998
756700326
154039122
912666641
198389915
441217014
828539613
540445603
318875843
63611499
411162966
140075077
467368741
150153430
198032502
175915156
594693521
249215482
330480759
274459851
510089864
937...

result:

wrong answer 1st numbers differ - expected: '319541931', found: '766074088'

Test #4:

score: 0
Wrong Answer
time: 70ms
memory: 96056kb

input:

100000 99989
703908936 826436271 431732352 607460686 960390248 897906950 506352459 662618885 172508812 713410533 704313866 156459539 879660919 98030681 46358006 400134234 121190289 498201666 616888945 210891377 39623412 687350951 269444705 980768130 381802923 553892268 644461704 287608268 554761733 ...

output:

567526525
451582584
313317089
142598287
281176416
784847998
104366441
716303866
479238990
806669191
866324965
84027415
149603681
783895961
117880326
724338120
262097122
497005586
901279768
774790979
715068450
740691894
584265210
262942009
796491460
1518186
660925364
650264822
372593691
66477186
4393...

result:

wrong answer 1st numbers differ - expected: '135579851', found: '567526525'

Test #5:

score: 0
Runtime Error

input:

1000000 999998
326289172 459965021 432610030 381274775 890620650 133203219 755508578 820410129 100497878 978894337 34545975 484258543 341383383 556328539 705716773 985485996 201697555 806763870 456757110 445252781 501965590 655584951 516373423 475444481 554722275 106826011 433893131 385018453 687541...

output:


result: