题目链接
题意
对于一个
n
位的数字
数据范围:
0<A,B<109
分析
记录 sum=f(A)−f(当前数字) 即可。
Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
int T, cases = 0, A, B;
int digit[10], dp[10][50000];
int dfs(int pos, int sum, int limit)
{
if (sum < 0) return 0;
if (pos == -1) return sum >= 0;
if (!limit && dp[pos][sum] != -1) return dp[pos][sum];
int last = limit ? digit[pos] : 9, ret = 0;
for (int i = 0; i <= last; ++i) {
int nxt = sum - i * (1 << (pos + 1));
ret += dfs(pos - 1, nxt, limit && (i == last));
}
if (!limit) dp[pos][sum] = ret;
return ret;
}
void solve()
{
memset(digit, 0, sizeof (digit));
int len = 0, sum = 0, base = 2;
while (A) {
sum += A % 10 * base;
A /= 10, base *= 2;
}
while (B) {
digit[len++] = B % 10;
B /= 10;
}
if (B == 0) digit[len++] = 0;
printf("Case #%d: %d\n", ++cases, dfs(len - 1, sum, 1));
}
int main()
{
memset(dp, -1, sizeof (dp));
scanf("%d", &T);
while (T--) {
scanf("%d%d", &A, &B);
solve();
}
return 0;
}