数位dp
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
int t,d[40],cur[40];
ll L,R,l,r,dp[40][40][40][2];
ll dfs(int k,int l,int r,bool flag,bool limit){
if(l==-1) return flag?k:1;
if(!limit&&dp[k][l][r][flag]) return dp[k][l][r][flag];
int mx=limit?d[l]:k-1;
ll ret=0;
for(int i=0;i<=mx;i++){
cur[l]=i;
if(i==0&&l==r)
ret+=dfs(k,l-1,r-1,flag,limit&&(i==mx));
else if(flag&&l*2<=r)
ret+=dfs(k,l-1,r,flag&&cur[l]==cur[r-l],limit&&(i==mx));
else
ret+=dfs(k,l-1,r,flag,limit&&(i==mx));
}
if(!limit) dp[k][l][r][flag]=ret;
return ret;
}
ll solve(ll n,ll k){
int pos=0;
while(n){
d[pos++]=n%k;
n/=k;
}
return dfs(k,pos-1,pos-1,1,1);
}
int main(){
scanf("%d",&t);
int cas=0;
while(t--){
scanf("%lld%lld%lld%lld",&L,&R,&l,&r);
ll ans=0;
for(int i=l;i<=r;i++)
ans+=solve(R,i)-solve(L-1,i);
printf("Case #%d: %lld\n",++cas,ans);
}
}