标签:
Problem Description:
For a decimal number x with n digits (AnAn-1An-2 ...
A2A1), we define its weight
as F(x) = An * 2n-1 + An-1 *
2n-2 + ... + A2 * 2 + A1 *
1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B, inclusive, whose weight is no more than F(A).
Input:
The first line has a number T (T <= 10000) , indicating the number of test cases.
For each test case, there are two numbers A and B (0 <= A,B < 109)
Output:
For every case,you should output "Case #t: " at first, without quotes. The t is
the case number starting from 1. Then output the answer.
Sample Input:
3
0 100
1 10
5
100
Sample Output:
Case #1: 1 Case #2: 2 Case #3: 13
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define ll long long using namespace std; const int MAXN = 200000 + 10;; int bit[20]; int A, B; int F(int x) { int ans = 0; int m = 0; while (x) { ans += (x % 10) * (1 << m); m++; x /= 10; } return ans; } int dp[20][MAXN]; int dfs(int pos, int pre, bool flag) { if (pos == -1) return (pre >= 0); if (pre < 0) return 0; if (!flag && dp[pos][pre] != -1) return dp[pos][pre]; int end = flag ? bit[pos] : 9; int ans = 0; for (int i = 0; i <= end; i++) ans += dfs(pos - 1, pre - i * (1 << pos), flag && i == end); if (!flag) return dp[pos][pre] = ans; return ans; } int solve(int x) { int m = 0; while (x) { bit[m++] = x % 10; x /= 10; } int res = dfs(m - 1, F(A), 1); return res; } int main() { int T, kcase = 1; cin >> T; memset(dp, -1, sizeof(dp)); while (T--) { cin >> A >> B; cout << "Case #" << kcase++ << ": " << solve(B) << endl; } //system("pause"); return 0; }
标签:
原文地址:http://blog.csdn.net/moguxiaozhe/article/details/45672227