[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;
vector <int> num;
int dp[11][10000];
int dfs(int pos, int remain, int limit){
if (pos == -1){
return (remain >= 5000);
}
if (!limit && ~dp[pos][remain]) return dp[pos][remain];
int end = limit?num[pos]:9;
int res = 0;
for (int i = 0; i <= end; i ++){
res += dfs(pos-1, remain-(1<<pos)*i, limit && (i == end));
}
if (!limit){
dp[pos][remain] = res;
}
return res;
}
int main(){
int t;
scanf("%d", &t);
MEM(dp, -1);
for (int ca = 1; ca <= t; ca ++){
int A, B;
scanf("%d %d", &A, &B);
num.clear();
while(B){
num.push_back(B % 10);
B /= 10;
}
int fa = 0;
for (int i = 0; A; A /= 10, ++ i){
fa += (1 << i) * (A % 10);
}
printf("Case #%d: %d\n", ca, dfs(num.size()-1, 5000+fa, 1));
}
return 0;
}
[/cpp]