結果
問題 | No.1482 Swap Many Permutations |
ユーザー |
![]() |
提出日時 | 2021-04-16 22:00:01 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,601 bytes |
コンパイル時間 | 1,948 ms |
コンパイル使用メモリ | 179,544 KB |
実行使用メモリ | 20,568 KB |
最終ジャッジ日時 | 2024-07-03 01:45:00 |
合計ジャッジ時間 | 14,918 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 WA * 7 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 998244353;long long modpow(long long a, long long b, long long mod = MOD){long long ans = 1;while (b > 0){if (b % 2 == 1){ans *= a;ans %= mod;}a *= a;a %= mod;b /= 2;}return ans;}long long modinv(long long a){return modpow(a, MOD - 2);}vector<long long> mf = {1};vector<long long> mfi = {1};long long modfact(int n){if (mf.size() > n){return mf[n];} else {for (int i = mf.size(); i <= n; i++){long long next = mf.back() * i % MOD;mf.push_back(next);mfi.push_back(modinv(next));}return mf[n];}}long long modfactinv(int n){if (mfi.size() > n){return mfi[n];} else {return modinv(modfact(n));}}vector<long long> ntt(vector<long long> A, bool inv){int N = A.size();long long r = 3;if (inv){r = modinv(r);}vector<long long> B(N);for (int i = N / 2; i > 0; i /= 2){long long z = modpow(r, (MOD - 1) / (N / i));long long z2 = 1;for (int j = 0; j < N; j += i * 2){for (int k = 0; k < i; k++){A[i + j + k] *= z2;A[i + j + k] %= MOD;B[j / 2 + k] = (A[j + k] + A[i + j + k]) % MOD;B[N / 2 + j / 2 + k] = (A[j + k] - A[i + j + k] + MOD) % MOD;}z2 = z2 * z % MOD;}swap(A, B);}if (inv){int Ninv = modinv(N);for (int i = 0; i < N; i++){A[i] = A[i] * Ninv % MOD;}}return A;}vector<long long> convolution(vector<long long> A, vector<long long> B, int d = -1){int deg = A.size() + B.size() - 1;int N = 1;while (N < deg){N *= 2;}A.resize(N);B.resize(N);A = ntt(A, false);B = ntt(B, false);vector<long long> ans(N);for (int i = 0; i < N; i++){ans[i] = A[i] * B[i] % MOD;}ans = ntt(ans, true);if (d != -1){deg = d;}ans.resize(deg);return ans;}int main(){int N;long long M;cin >> N >> M;vector<int> B(N), C(N);for (int i = 0; i < N; i++){cin >> B[i] >> C[i];}cout << 1 << endl;cout << (M * (M - 1)) % MOD << endl;if (M == 2){for (int i = 2; i < N; i++){cout << 0 << endl;}} else {vector<int> f;for (int i = M - 1; i >= 1; i--){if ((M - 1) % i == 0){f.push_back(i);}}vector<int> mn(M);for (int i = 1; i < M; i++){for (int j : f){if (modpow(i, j, M) == 1){mn[i] = j;}}}vector<int> cnt(2, 0);for (int i = 1; i < M; i++){int x = (M - 1) / mn[i] * (mn[i] - 1);cnt[x % 2] += M;}vector<long long> f1(N + 1);vector<long long> g(N + 1);f1[0] = 1;g[0] = 1;for (int i = 0; i < N; i++){if (i >= cnt[1]){f1[i + 1] = 0;} else {f1[i + 1] = f1[i] * (cnt[1] + MOD - i) % MOD;}if (i >= cnt[0]){g[i + 1] = 0;} else {g[i + 1] = g[i] * (cnt[0] + MOD - i) % MOD;}}for (int i = 0; i <= N; i++){f1[i] *= modfactinv(i);f1[i] %= MOD;g[i] *= modfactinv(i);g[i] %= MOD;}vector<long long> f2 = f1;for (int i = 1; i <= N; i += 2){f1[i] = 0;}for (int i = 0; i <= N; i += 2){f2[i] = 0;}vector<long long> h1 = convolution(f1, g);vector<long long> h2 = convolution(f2, g);int sum = 0;for (int i = 0; i < N; i++){sum += (M - 1) / mn[C[i]] * (mn[C[i]] - 1) % 2;if (i >= 2){if (i % 2 == 0 || sum % 2 == 0){cout << h1[i + 1] * modfact(i + 1) % MOD << endl;} else {cout << h2[i + 1] * modfact(i + 1) % MOD << endl;}}}}}