結果
問題 | No.2384 Permutations of Permutations |
ユーザー |
![]() |
提出日時 | 2023-07-14 22:24:39 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 2,318 bytes |
コンパイル時間 | 2,098 ms |
コンパイル使用メモリ | 183,956 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-16 07:29:47 |
合計ジャッジ時間 | 3,062 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 998244353;int main(){int N, K;cin >> N >> K;if (N == 2){cout << 1 << endl;} else if (N == 6){vector<int> p = {0, 1, 2, 3, 4, 5};vector<vector<int>> pp;for (int i = 0; i < 720; i++){pp.push_back(p);next_permutation(p.begin(), p.end());}auto product = [&](vector<int> p, vector<int> q){vector<int> ans(6);for (int i = 0; i < 6; i++){ans[i] = p[q[i]];}return ans;};auto inverse = [&](vector<int> p){vector<int> q(6);for (int i = 0; i < 6; i++){q[p[i]] = i;}return q;};auto conjugation = [&](vector<int> f, vector<int> p){return product(p, product(f, inverse(p)));};auto outer = [&](vector<int> f){vector<int> T;for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){if (f[j] > f[j + 1]){T.push_back(j);swap(f[j], f[j + 1]);}}}reverse(T.begin(), T.end());int cnt = T.size();vector<int> ans = {0, 1, 2, 3, 4, 5};for (int i = 0; i < cnt; i++){if (T[i] == 0){ans = product(vector<int>{1, 0, 3, 2, 5, 4}, ans);}if (T[i] == 1){ans = product(vector<int>{2, 4, 0, 5, 1, 3}, ans);}if (T[i] == 2){ans = product(vector<int>{4, 5, 3, 2, 0, 1}, ans);}if (T[i] == 3){ans = product(vector<int>{2, 3, 0, 1, 5, 4}, ans);}if (T[i] == 4){ans = product(vector<int>{5, 4, 3, 2, 1, 0}, ans);}}return ans;};vector<int> f = {0, 1, 2, 3, 4, 5};rotate(f.begin(), f.begin() + 1, f.begin() + K);auto check = [&](vector<int> p){for (int i = 0; i < K; i++){if (p[i] != f[i]){return false;}}return true;};int ans = 0;for (int i = 0; i < 720; i++){if (check(conjugation(f, pp[i]))){ans++;}if (check(conjugation(outer(f), pp[i]))){ans++;}}cout << ans << endl;} else {long long ans = K;for (int i = 1; i <= N - K; i++){ans *= i;ans %= MOD;}cout << ans << endl;}}