题意:
我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字。
题目给出a,b,求出0~b有多少个不大于f(a)的数。
分析:
dp[i][j]表示i位值<=j 的总数
#include<bits/stdc++.h> using namespace std; int dp[20][200000], bit[20]; int A, B; int dfs(int pos, int num, bool flag) { if(pos == -1) return num >= 0; if(num < 0) return 0; if(!flag && dp[pos][num] != -1) return dp[pos][num]; int ans = 0; int lim = flag ? bit[pos] : 9; for(int i = 0; i <= lim; i++) ans += dfs(pos-1, num-i*(1<<pos), flag&&i==lim); if(!flag) dp[pos][num] = ans; return ans; } int F(int x) { int ret = 0, len = 0; while(x) { ret += (x)*(1<<len); len++; x /= 10; } return ret; } int calc() { int len = 0; while(B) { bit[len++] = B % 10; B /= 10; } return dfs(len-1, F(A), true); } int main() { int t; scanf("%d", &t); memset(dp, -1, sizeof(dp)); for(int kase = 1; kase <= t; kase++) { scanf("%d%d", &A, &B); printf("Case #%d: %d\n", kase, calc()); } return 0; }