結果
| 問題 |
No.916 Encounter On A Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-02-18 16:09:00 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 18 ms / 2,000 ms |
| コード長 | 1,490 bytes |
| コンパイル時間 | 2,054 ms |
| コンパイル使用メモリ | 194,604 KB |
| 最終ジャッジ日時 | 2025-01-18 22:18:40 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 56 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
int depth(int v) {
int d = 0;
while (v > 0) {
++d;
v /= 2;
}
return d;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
vector<long long> f(1<<20);
f[0] = 1;
for (int i = 1; i < 1<<20; i++)
f[i] = f[i-1] * i % MOD;
int d, l, r, k;
cin >> d >> l >> r >> k;
// r の方が深いところにある
if (depth(l) > depth(r))
swap(l, r);
int dl = depth(l), dr = depth(r);
long long ret = 1;
if (dl == dr) {
for (int i = 1; i <= d; i++) {
if (i != dl) {
ret *= f[1<<(i-1)];
ret %= MOD;
} else {
if (k % 2 || k < 2 || k > dl + dr - 2)
ret = 0;
else {
int ptr = 1<<(i-1);
ret *= ptr;
ret %= MOD;
ret *= 1<<(k / 2 - 1);
ret %= MOD;
ret *= f[ptr - 2];
ret %= MOD;
}
}
}
} else {
for (int i = 1; i <= d; i++) {
if (i != dr) {
ret *= f[1<<(i-1)];
ret %= MOD;
} else {
int tmp = k - (dr - dl);
if (tmp < 0 || k > dl + dr - 2 || tmp % 2)
ret = 0;
else {
int base = 1<<(dr - dl);
for (int j = 0; j < tmp/2-1; j++)
base *= 2;
ret *= base;
ret %= MOD;
int ptr = 1<<(i-1);
ret *= f[ptr - 1];
ret %= MOD;
}
}
}
}
cout << ret << endl;
return 0;
}