题意:给出a, b两个数, 求0到b不大于f(a)的数的个数, F(x) = A
n * 2
n-1 + A
n-1 * 2
n-2 + ... + A
2 * 2 + A
1 * 1. An表示a对于位上的值
用数位DP,这里讲的比较详细http://www.cnblogs.com/Griselda/archive/2013/11/20/3433295.html
#include <stdio.h>
#include <string.h>
int w[12], dp[10][200000];
int dfs(int len, int pre, bool flag)
{
if(len < 0) return pre >= 0;
if(pre < 0) return 0;
if(!flag && dp[len][pre] != -1) return dp[len][pre];//已经求得
int End = flag?w[len]:9, ans = 0;
for(int i = 0;i <= End;i++)
ans += dfs(len - 1, pre - i*(1 << len), flag&&i == End);
if(!flag) dp[len][pre] = ans;
return ans;
}
int f(int a)
{
int p = 1, sum = 0;
while(a > 0)
{
sum += (a % 10) * p;
p *= 2;
a /= 10;
}
return sum;
}
int slove(int a, int b)
{
int top = 0;
while(b > 0)
{
w[top++] = b % 10;
b /= 10;
}
return dfs(top - 1, f(a), true);
}
int main()
{
int t, i, a, b;
scanf("%d", &t);
memset(dp, -1, sizeof(dp));
for(i = 1;i <= t;i++)
{
scanf("%d %d", &a, &b);
printf("Case #%d: %d\n", i, slove(a, b));
}
}