
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6
7 const int maxn=1e4+5;
8
9 int A,B,sum;
10 int num[40],dp[40][maxn];
11
12 int F(int x){
13 if(x==0) return 0;
14 int ans=F(x/10);
15 return ans*2+(x%10);
16 }
17
18 int DFS(int pos,int res,bool F){
19 if(pos==-1) return res<=sum;
20 if(res>sum) return 0;
21 if(!F&&dp[pos][sum-res]!=-1) return dp[pos][sum-res];
22
23 int maxv=F?num[pos]:9;
24 int ans=0;
25 for(int i=0;i<=maxv;i++) ans=ans+DFS(pos-1,res+i*(1<<pos),F&&i==maxv);
26
27 if(!F) dp[pos][sum-res]=ans;
28 return ans;
29 }
30
31 int Solve(int temp){
32 if(temp==0) return 1;
33 int cnt=0;
34 while(temp){
35 num[cnt++]=temp%10;
36 temp/=10;
37 }
38 return DFS(cnt-1,0,true);
39 }
40
41 int main()
42 { int kase;
43 cin>>kase;
44 memset(dp,-1,sizeof(dp)); //放在循坏里面会超时
45 for(int t=1;t<=kase;t++){
46 cin>>A>>B;
47 sum=F(A);
48 printf("Case #%d: %d\n",t,Solve(B));
49 }
50 return 0;
51 }
1 int DFS(int pos,int res,bool F){
2 if(res>sum) return 0;
3 if(pos==-1) return 1;
4 if(!F&&dp[pos][sum-res]!=-1) return dp[pos][sum-res];
5
6 int maxv=F?num[pos]:9;
7 int ans=0;
8 for(int i=0;i<=maxv;i++) ans=ans+DFS(pos-1,res+i*(1<<pos),F&&i==maxv);
9
10 if(!F) dp[pos][sum-res]=ans;
11 return ans;
12 }