#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 10;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)
int dp[20][200000], bit[20], t;
int calc (int l, int r);
int dfs (int len, int sum, bool ismax);
int getsum (int l);
int main ()
{
met (dp, -1);
cin >> t;
for (int i=1; i<=t; i++)
{
int l, r;
cin >> l >> r;
cout << "Case #" << i << ": ";
cout << calc (l, r) << endl;
}
return 0;
}
int getsum (int l)
{
int sum = 0, tmp = 1;
while (l)
{
sum += l % 10 * tmp;
l /= 10;
tmp <<= 1;
}
return sum;
}
int calc (int l, int r)
{
int len = 0;
for (; r; bit[len++]=r%10, r/=10);
return dfs (len-1, getsum(l), true);
}
int dfs (int len, int sum, bool ismax)
{
if (len < 0) return sum >= 0;
if (sum < 0) return 0;
if (!ismax && dp[len][sum] != -1) return dp[len][sum];
int cnt = 0, maxnum = ismax ? bit[len] : 9;
for (int i=0; i<=maxnum; i++)
cnt += dfs(len - 1, sum-i*(1<<len), ismax && i == maxnum); //老是忘记写上dfs,编译器也不提示,魂淡.
return ismax ? cnt : dp[len][sum] = cnt;
}
hdu 4734
最新推荐文章于 2024-01-25 12:36:45 发布