結果
| 問題 |
No.2668 Trees on Graph Paper
|
| コンテスト | |
| ユーザー |
hitonanode
|
| 提出日時 | 2024-03-09 09:57:51 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,080 ms / 3,000 ms |
| コード長 | 1,127 bytes |
| コンパイル時間 | 927 ms |
| コンパイル使用メモリ | 85,020 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-09-29 21:12:30 |
| 合計ジャッジ時間 | 13,176 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <array>
#include <iostream>
using namespace std;
#define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define REP(i, n) FOR(i,0,n)
using Mat = std::array<long long, 9>;
int M;
Mat operator*(const Mat &a, const Mat &b) {
Mat ret{};
REP(i, 3) REP(j, 3) {
auto v = a[i * 3 + 0] * b[0 * 3 + j] + a[i * 3 + 1] * b[1 * 3 + j] + a[i * 3 + 2] * b[2 * 3 + j];
ret[i * 3 + j] = v % M;
}
return ret;
}
int main() {
int N;
cin >> N >> M;
Mat dp1, trans1;
dp1.fill(0);
dp1[0] = dp1[4] = dp1[8] = 1;
trans1.fill(1);
trans1[2] = 0;
auto setter = [&](long long i) {
trans1[1 * 3 + 0] = i + 1;
trans1[2 * 3 + 0] = i * (i + 1) % M;
trans1[2 * 3 + 1] = i;
};
long long ret = 1;
REP(i, N - 1) {
setter(i * 2);
dp1 = trans1 * dp1;
setter(i * 2 + 1);
dp1 = trans1 * dp1;
ret = ret * dp1[0 * 3 + 2] % M;
}
FOR(i, 1, N * 2) ret = ret * i % M;
cout << ret << '\n';
}
hitonanode