結果

問題 No.916 Encounter On A Tree
ユーザー pockyny
提出日時 2019-10-25 23:17:58
言語 C++17(1z)
(gcc 8.3.0)
結果
WA   .
実行時間 -
コード長 790 Byte
コンパイル時間 419 ms
使用メモリ 11,736 KB
最終ジャッジ日時 2019-10-25 23:18:12

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
corner1 WA -
corner2 AC 3 ms
6,872 KB
corner3 AC 2 ms
8,920 KB
corner4 AC 25 ms
11,732 KB
corner5 AC 3 ms
6,876 KB
corner6 AC 25 ms
11,736 KB
corner7 WA -
corner8 AC 26 ms
11,732 KB
corner9 AC 26 ms
11,736 KB
corner10 AC 25 ms
11,736 KB
corner11 AC 3 ms
6,872 KB
corner12 AC 25 ms
11,732 KB
corner13 AC 3 ms
6,872 KB
corner14 AC 25 ms
11,736 KB
corner15 AC 3 ms
6,872 KB
corner16 AC 26 ms
11,732 KB
corner17 AC 3 ms
6,876 KB
corner18 AC 26 ms
11,732 KB
corner19 AC 25 ms
11,732 KB
corner20 AC 26 ms
11,732 KB
corner21 WA -
large1 AC 26 ms
11,736 KB
large2 AC 3 ms
6,872 KB
large3 AC 25 ms
11,732 KB
large4 AC 3 ms
6,876 KB
large5 AC 25 ms
11,736 KB
large6 AC 3 ms
6,876 KB
large7 AC 26 ms
11,732 KB
large8 AC 3 ms
6,876 KB
large9 AC 25 ms
11,736 KB
large10 AC 3 ms
6,876 KB
large11 AC 3 ms
6,872 KB
large12 AC 3 ms
6,876 KB
large13 AC 3 ms
6,872 KB
large14 AC 25 ms
11,732 KB
large15 AC 26 ms
11,732 KB
large16 AC 27 ms
11,732 KB
large17 AC 28 ms
11,732 KB
large18 AC 26 ms
11,736 KB
large19 AC 3 ms
6,872 KB
large20 AC 26 ms
11,732 KB
sample1 AC 25 ms
11,728 KB
sample2 AC 26 ms
11,736 KB
sample3 AC 26 ms
11,732 KB
sample4 AC 3 ms
6,876 KB
sample5 AC 26 ms
11,736 KB
small1 AC 3 ms
6,876 KB
small2 AC 25 ms
11,732 KB
small3 AC 3 ms
6,872 KB
small4 AC 26 ms
11,736 KB
small5 AC 25 ms
11,736 KB
small6 AC 26 ms
11,736 KB
small7 AC 25 ms
11,732 KB
small8 AC 26 ms
11,736 KB
small9 AC 3 ms
6,872 KB
small10 AC 26 ms
11,736 KB
small11 AC 25 ms
11,736 KB
small12 AC 25 ms
11,732 KB
small13 AC 26 ms
11,732 KB
small14 AC 25 ms
11,736 KB
small15 AC 26 ms
11,736 KB
テストケース一括ダウンロード

ソースコード

diff #
#include <iostream>

using namespace std;
int dig(int x){
	int d = 0;
	while(x){
		x /= 2;
		d++;
	}
	return d;
}
long long mod = 1000000007,f[1<<21];
void solve(){
	f[0] = 1;
	int i;
	for(i=1;i<(1<<20);i++){
		f[i] = i*f[i - 1]%mod;
	}
}

int main(){
	int i,j,d,l,r,k;
	cin >> d >> l >> r >> k;
	int d1 = dig(l),d2 = dig(r);
	if(d1 + d2 - k<=0 || (d1 + d2 - k)&1){
		cout << 0 << endl;
		return 0;
	}
	solve();
	int dep = (d1 + d2 - k)/2;
	long long ans = 1;
	for(i=1;i<=d;i++){
		if(i!=d2){
			(ans *= f[1<<(i - 1)]) %= mod;
		}
	}
	int d3 = d2 - dep;
	if(dep!=d1) d3--;
	if(d1==d2){
		(ans *= (1<<(d2 - 1))) %= mod;
		(ans *= f[(1<<(d2 - 1)) - 2]) %= mod;
		(ans *= (1<<(d3))) %= mod;
	}else{
		(ans *= f[(1<<(d2 - 1)) - 1]) %=mod;
		(ans *= (1<<(d3))) %= mod;
	}
	cout << ans << endl;
}
0