数位dp水题。
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll a, b, fa = 0, p = 1, ans;
ll dp[12][10000];
ll s[12], w[20] = {1};
ll dfs(int pos, ll pre, int lim){
if(pos < 1){
return pre >= 0;
}
if(!lim && dp[pos][pre] != -1){
return dp[pos][pre];
}
int end = lim ? s[pos] : 9;
ll ret = 0;
for(int i = 0; i <= end; i++){
ret += dfs(pos - 1, pre - i * w[pos - 1], lim && (i == end));
}
if(!lim){
dp[pos][pre] = ret;
}
return ret;
}
int main(){
int T;
memset(dp, -1, sizeof(dp));
scanf("%d", &T);
for(int i = 1; i <= 20; i++) w[i] = w[i - 1] * 2;
for(int kase = 1; kase <= T; kase++){
int len = 0;
ans = fa = 0, p = 1;
scanf("%d%d", &a, &b);
while(a){
fa += a % 10 * p;
a /= 10;
p <<= 1;
}
while(b){
s[++len] = b % 10;
b /= 10;
}
ans += dfs(len, fa, 1);
printf("Case #%d: %lld\n", kase, ans);
}
return 0;
}