uva1228

#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<sstream>
#include<cassert>
using namespace std;
const int maxn = 64;
int n, d, K[maxn];
unsigned long long f[maxn + 1][maxn + 1];
int zcnt = 0, ocnt = 0;
int Z[maxn], O[maxn];
unsigned long long minv, maxv;
bool can_receive_zero(int i, int j) {
	return i + 1 <= zcnt && (j == ocnt || O[j] + d >= Z[i]);
}
bool can_receive_one(int i, int j) {
	return j + 1 <= ocnt && (i == zcnt || Z[i] + d >= O[j]);
}
void greedy() {
	minv = maxv = 0;
	int i = 0,j = 0;
	while (i < zcnt || j < ocnt) {//優先傳送0
		if (can_receive_zero(i, j)) { i++; minv = minv * 2; }
		else { j++; minv = minv * 2 + 1; }
	}
	i = j = 0;
	while (i < zcnt || j < ocnt) {//優先傳送1
		if (can_receive_one(i, j)) { j++; maxv = maxv * 2+1; }
		else { i++; maxv = maxv * 2; }
	}
}
void solve() {
	ocnt = zcnt = 0;
	for (int i = 0; i < n; i++) {
		if (K[i] == 1)O[ocnt++] = i;
		else Z[zcnt++] = i;
	}
	greedy();
	memset(f, 0, sizeof(f));
	f[0][0] = 1;
	for (int i = 0; i <= zcnt; i++) {
		for (int j = 0; j <= ocnt; j++) {
			if (can_receive_zero(i, j))f[i + 1][j] += f[i][j];
			if (can_receive_one(i, j))f[i][j+1] += f[i][j];
		}
		cout << f[zcnt][ocnt] << " " << minv << " " << maxv << endl;
	}
}
int main() {
	int kase = 0;
	unsigned long long k;
	while (cin >> n >> d >> k) {
		for (int i = 0; i < n; i++) {
			K[n - i - 1] = k % 2; k /= 2;
		}
		cout << "Case " << ++kase << " :";
		solve();
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章