[cpp] #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <set> #include <stack> #include <queue> #define MID(x,y) ((x+y)/2) #define MEM(a,b) memset(a,b,sizeof(a)) #define REP(i, begin, end) for (int i = begin; i <= end; i ++) using namespace std; vector <int> num; int dp[11][10000]; int dfs(int pos, int remain, int limit){ if (pos == -1){ return (remain >= 5000); } if (!limit && ~dp[pos][remain]) return dp[pos][remain]; int end = limit?num[pos]:9; int res = 0; for (int i = 0; i <= end; i ++){ res += dfs(pos-1, remain-(1<<pos)*i, limit && (i == end)); } if (!limit){ dp[pos][remain] = res; } return res; } int main(){ int t; scanf("%d", &t); MEM(dp, -1); for (int ca = 1; ca <= t; ca ++){ int A, B; scanf("%d %d", &A, &B); num.clear(); while(B){ num.push_back(B % 10); B /= 10; } int fa = 0; for (int i = 0; A; A /= 10, ++ i){ fa += (1 << i) * (A % 10); } printf("Case #%d: %d\n", ca, dfs(num.size()-1, 5000+fa, 1)); } return 0; } [/cpp]