結果

問題 No.916 Encounter On A Tree
ユーザー k
提出日時 2021-01-20 18:01:29
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,404 bytes
コンパイル時間 3,440 ms
コンパイル使用メモリ 194,496 KB
最終ジャッジ日時 2025-01-18 02:55:09
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 29 WA * 27
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(int i=0; i<(int)(n); i++)

const long long MOD = 1e9 + 7;

int depth(int x) {
  int d = 0;
  while (x) {
    x >>= 1;
    ++d;
  }
  return d;
}

int lca(int l, int r, int k, int d) {
  int x = depth(l) + depth(r) - k;
  if (x % 2)
    return -1;
  x /= 2;
  if (1 <= x && x <= d)
    return x;
  return -1;
}

int solve(int d, int l, int r, int k) {
  vector<long long> f(1000000);
  f[0] = 1;
  for (int i = 1; i < 1000000; i++)
    f[i] = f[i-1]  * i % MOD;
  
  int x = lca(l, r, k, d);
  if (x == -1)
    return 0;
  
  long long ret = 1;
  if (depth(l) == depth(x)) {
    for (int i = 1; i <= d; i++) {
      int j = 1<<(i-1);
      ret = ret * f[j] % MOD;
    }
  } else if (depth(l) < depth(r)) {
    for (int i = 1; i <= d; i++) {
      int j = 1<<(i-1);
      if (i == depth(r)) {
        int tmp = 1<<(i-x-1);
        ret = ret * tmp * f[j-1] % MOD;
      } else {
        ret = ret * f[j] % MOD;
      }
    }
  } else {
    for (int i = 1; i <= d; i++) {
      int j = 1<<(i-1);
      if (i == depth(r)) {
        int tmp = 1<<(i-x-1);
        ret = ret * j * tmp * f[j-2] % MOD;
      } else {
        ret = ret * f[j] % MOD;
      }
    }
  }
  return ret;
}


int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int d, l, r, k;
  cin >> d >> l >> r >> k;
  cout << solve(d, l, r, k) << endl;
  
  return 0;
}
0