数位DP,真男人不解释。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define K ((1<<9)*9)
using namespace std;
int T, A, B, dp[9][10][K];
inline void init()
{
memset(dp, 0, sizeof(dp));
for(int j = 0; j < 10; ++j)
for(int k = j; k < K; ++k)
dp[0][j][k] = 1;
for(int i = 1; i < 9; ++i)
for(int j = 0; j < 10; ++j)
for(int k = 0; k < K; ++k)
for(int l = 0; l < 10 && (k-j*(1<<i)) >= 0; ++l)
dp[i][j][k] += dp[i-1][l][k-j*(1<<i)];
}
inline int f(int x)
{
int ret = 0, i = 1;
while(x)
{
ret += x%10 * i;
x /= 10;
i <<= 1;
}
return ret;
}
inline int solve(int b, int x)
{
int w = 0, bb = b, a[20];
while(bb)
{
a[w++] = bb%10;
bb /= 10;
}
int ret = 0;
if(f(b) <= x) ret++;
for(int i = w-1; i >= 0; --i)
{
for(int j = 0; j < a[i]; ++j)
ret += dp[i][j][x];
x -= a[i]*(1<<i);
if(x < 0) break;
}
return ret;
}
int main(int argc, char **argv)
{
init();
scanf("%d", &T);
for(int cas = 1; cas <= T; ++cas)
{
scanf("%d%d", &A, &B);
printf("Case #%d: %d\n", cas, solve(B, f(A)));
}
return 0;
}