結果

問題 No.1307 Rotate and Accumulate
ユーザー WizistWizist
提出日時 2020-12-06 00:03:03
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 254 ms / 5,000 ms
コード長 2,354 bytes
コンパイル時間 1,648 ms
コンパイル使用メモリ 172,744 KB
実行使用メモリ 15,492 KB
最終ジャッジ日時 2023-10-14 10:54:14
合計ジャッジ時間 5,536 ms
ジャッジサーバーID
(参考情報)
judge12 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,348 KB
testcase_01 AC 1 ms
4,352 KB
testcase_02 AC 2 ms
4,348 KB
testcase_03 AC 2 ms
4,348 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 AC 1 ms
4,352 KB
testcase_06 AC 2 ms
4,352 KB
testcase_07 AC 2 ms
4,480 KB
testcase_08 AC 124 ms
9,748 KB
testcase_09 AC 126 ms
9,736 KB
testcase_10 AC 129 ms
9,340 KB
testcase_11 AC 121 ms
9,428 KB
testcase_12 AC 127 ms
9,204 KB
testcase_13 AC 21 ms
4,352 KB
testcase_14 AC 63 ms
6,096 KB
testcase_15 AC 254 ms
15,336 KB
testcase_16 AC 254 ms
15,468 KB
testcase_17 AC 253 ms
15,472 KB
testcase_18 AC 247 ms
15,492 KB
testcase_19 AC 253 ms
15,432 KB
testcase_20 AC 254 ms
15,412 KB
testcase_21 AC 1 ms
4,372 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// No.1307 Rotate and Accumulate
#include <bits/stdc++.h>

using namespace std;

void ntt(vector<long long> &a, bool inverse = false, long long mod = 998244353, int root = 3)
{
	auto pow = [&](long long x, long long n) {
		long long r = 1;
		for ( ; n > 0; x = x * x % mod, n >>= 1) if (n & 1) r = r * x % mod;
		return r;
	};
	int n = 1 << (32 - __builtin_clz(a.size() - 1));
	for (auto &x : a) x %= mod;
	if (a.size() < n) a.resize(n);
	vector<long long> r(32);
	for (int i = 0; i < r.size(); i++) r[i] = mod - pow(root, (mod - 1) >> (i + 2));

	if (!inverse) {
		for (int k = n >> 1; k; k >>= 1) {
			long long w = 1;
			for (int s = 0; s < n; s += k * 2, w = w * r[__builtin_ctz(s / k / 2)] % mod)
				for (int i = s, j = s + k; i < s + k; i++, j++) {
					long long u = a[i], v = a[j] * w % mod;
					// a[i] = (u + v) % mod;
					// a[j] = (u - v + mod) % mod;
					a[i] = u + v < mod ? u + v : u + v - mod;
					a[j] = u - v >= 0 ? u - v : u - v + mod;
				}
		}
	} else {
		vector<long long> ir(r.size());
		for (int i = 0; i < r.size(); i++) ir[i] = pow(r[i], mod - 2);
		for (int k = 1; k < n; k <<= 1) {
			long long w = 1;
			for (int s = 0; s < n; s += k * 2, w = w * ir[__builtin_ctz(s / k / 2)] % mod)
				for (int i = s, j = s + k; i < s + k; i++, j++) {
					long long u = a[i], v = a[j];
					// a[i] = (u + v) % mod;
					// a[j] = (u - v + mod) % mod * w % mod;
					a[i] = u + v < mod ? u + v : u + v - mod;
					a[j] = (u - v >= 0 ? u - v : u - v + mod) * w % mod;
				}
		}
		long long n_1 = pow(n, mod - 2);
		for (auto &x : a) x = x * n_1 % mod;
	}
}

vector<long long> multiply(const vector<long long> &a, const vector<long long> &b)
{
	vector<long long> fa(a.begin(), a.end()), fb(b.begin(), b.end());
	int n = 1 << (32 - __builtin_clz(a.size() + b.size() - 1));
	fa.resize(n); fb.resize(n);
	ntt(fa, false); ntt(fb, false);
	for (int i = 0; i < n; i++) fa[i] *= fb[i];
	ntt(fa, true);
	return fa;
}

int main(int argc, char *argv[])
{
	cin.tie(0)->sync_with_stdio(0);
	int n, q;
	cin >> n >> q;
	vector<int> a(n), r(q);
	for (auto &x : a) cin >> x;
	for (auto &x : r) cin >> x;

	vector<long long> f(n * 2), g(n + 1);
	for (int i = 0; i < n; i++) f[i] = f[i + n] = a[i];
	for (auto x : r) g[n - x]++;

	auto c = multiply(f, g);
	for (int i = n; i < n + n; i++) cout << (i > n ? " " : "") << c[i];
	cout << endl;

	return 0;
}
0