没写过几个数位dp的题,拿来练练手..dp[i][j]表示在没有高位限制的情况下,枚举到第i位时,余下的权重为j时有多少符合的情况(因为只记录了没有高位限制的情况,所以多组数据间dp数组可以共用)dfs(pos,res,f)分别表示枚举到第pos位,权重还剩下res,高位是否限制的标记f,直接计算一下B的值就好了。
/*=============================================================================
# Author:Erich
# FileName:
=============================================================================*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#define lson id<<1,l,m
#define rson id<<1|1,m+1,r
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll INF=1ll<<60;
const double PI=acos(-1.0);
int n,m;
int A;
int B;
int dp[11][20000];
int num[11];
int f(int x)
{
int len=0;
int res=0;
for (len=0; x; len++)
{
res+=(x%10)*(1<<len);
x/=10;
}
return res;
}
int dfs(int pos,int res,bool f)
{
if (pos==-1) return res>=0;
if (res<0) return 0;
if (!f && dp[pos][res]!=-1) return dp[pos][res];
int u;
if (f) u=num[pos];
else u=9;
int ans=0;
for (int i=0; i<=u; i++)
{
ans+=dfs(pos-1,res-i*(1<<pos),f&&(i==u));
}
if (!f) dp[pos][res]=ans;
return ans;
}
int calc(int x)
{
int len=0;
for (len=0; x; len++)
num[len]=x%10,x/=10;
int up=f(A);
return dfs(len-1,up,true);
}
int main()
{
// freopen("in.txt","r",stdin);
int tt;
scanf("%d",&tt);
int cnt=0;
memset(dp,-1,sizeof dp);
while(tt--)
{
scanf("%d%d",&A,&B);
int ans=calc(B);
printf("Case #%d: %d\n",++cnt,ans);
}
return 0;
}