#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;

vector<pair<int,int> > v[2];

int a[100],t[200][200];
unsigned long long dp[200][200],maxn[200][200],minn[200][200];
bool use[200][200];
int main(){
	int n,d,i,j,tt,m,c=0;
	unsigned long long k,mm;
	while(cin>>n){
		if(n==0)	break;
		cin>>d>>k;
		c++;
		memset(a,0,sizeof(a));
		v[0].clear();	v[1].clear();
		m=n;
		while(k){
			a[m]=k%2;
			k/=2;
			m--;
		}
		for(i=1;i<=n;i++){
			v[a[i]].push_back(pair<int,int>(i,i+d));
		}
		memset(dp,0,sizeof(dp));
		memset(t,0,sizeof(t));
		memset(use,false,sizeof(use));
		dp[0][0]=1;	t[0][0]=0;
		maxn[0][0]=minn[0][0]=0;
//		cout<<v[1].size()<<endl;
		for(i=1;i<=v[1].size();i++){
			if(dp[i-1][0]){
				tt=max(t[i-1][0],v[1][i-1].first);
				if(tt<=v[1][i-1].second&&tt>=i){
					dp[i][0]=1;
					t[i][0]=tt;
					maxn[i][0]=minn[i][0]=maxn[i-1][0]*2+1;
					cout<<"dp  "<<i<<" "<<0<<" "<<dp[i][0]<<endl;
				}
			}
		}
		for(m=1;m<=n;m++){
			for(i=1;i<=v[0].size()&&i<=m&&m-i<=v[1].size();i++){
				if(dp[m-1][i]){
					tt=max(t[m-1][i],v[1][m-i-1].first);
					if(tt<=v[1][m-i-1].second&&tt>=i){
						dp[m][i]+=dp[m-1][i];
						t[m][i]=tt;
						maxn[m][i]=maxn[m-1][i]*2+1;
						minn[m][i]=minn[m-1][i]*2+1;
						use[m][i]=true;
						cout<<"f  "<<m<<" "<<i<<" "<<maxn[m][i]<<endl;
					}
				}
				if(dp[m-1][i-1]){
					tt=max(t[m-1][i-1],v[0][i-1].first);
					if(tt<=v[0][i-1].second&&tt>=i){
						dp[m][i]+=dp[m-1][i-1];
						t[m][i]=tt;
						if(!use[m][i]){
							maxn[m][i]=maxn[m-1][i]*2;
							minn[m][i]=minn[m-1][i]*2;
						}
						else{
							maxn[m][i]=max(maxn[m][i],maxn[m-1][i]*2);
							minn[m][i]=min(minn[m][i],minn[m-1][i]*2);
						}
						cout<<"f  "<<m<<" "<<i<<" "<<maxn[m][i]<<endl;
					}
				}
				cout<<"dp "<<m<<" "<<i<<" "<<dp[m][i]<<endl;
//				cout<<"----"<<m<<" "<<i<<endl;
			}
		}
//		cout<<maxn[3][1]<<endl;
		printf("Case %d: ",c);
		cout<<dp[n][v[0].size()];
		cout<<" "<<minn[n][v[0].size()]<<" "<<maxn[n][v[0].size()]<<endl;
	}
}
