题目要求求出在
内
的
个数。
很自然会联想到用数位
来解决。
观察
的形式。
题目给出了
;联想到有
。
那么
要怎么嵌入数位
?
注意到
有
,或许可以把
存进状态里面
这样的话就是
表示
位后,
的
的数量
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;
int A,B;
int F[12][4605];
int bit[12];
int calc(int x) {
int ret = 0, add = 1;
while (x) {
ret += x % 10 * (add <<= 1);
x /= 10;
}
return ret;
}
int dfs(const int &pos, const int &state, const bool &limit) {
if (!pos) {
return state >= 0;
}
if (state < 0) {
return 0;
}
if (!limit && F[pos][state] != -1) {
return F[pos][state];
}
int retVal = 0, up = limit ? bit[pos] : 9;
for (int i = 0; i <= up; ++i) {
retVal += dfs( pos - 1, state - i * (1 << pos), limit && i == up );
}
if (!limit) {
F[pos][state] = retVal;
}
return retVal;
}
int solve(int x,const int &y) {
bit[0] = 0;
while (x) {
bit[ ++bit[0] ] = x % 10;
x /= 10;
}
return dfs(bit[0], calc(y), true);
}
int main() {
int T;
scanf("%d", &T);
memset( F, -1, sizeof(F) );
for (int caseNumber = 1; caseNumber <= T; ++caseNumber) {
scanf( "%d%d", &A, &B);
printf( "Case #%d: %d\n", caseNumber, solve(B, A) );
}
return 0;
}