传送门
题解:找出i∈[0~b]且f(i)≤f(a)的数的个数。
设dp[i][j]表示当前从高往低在第i位,f(a)被减还剩下j的方案数。
看题花的时间比做题长。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[11][19000],b[11];
inline int f(int x) {
int ret=0,i=-1;
while (x) {
ret+=(x%10)*(1<<(++i)),x/=10;
}
return ret;
}
int dfs(int pos,int st,bool lim) {
if (!pos) return st>=0;
if (st<0) return 0;
if (!lim&&~dp[pos][st]) return dp[pos][st];
int end=lim?b[pos]:9,ans=0;
for (int i=0;i<=end;++i)
ans+=dfs(pos-1,st-i*(1<<(pos-1)),lim&&i==end);
if (!lim) dp[pos][st]=ans;
return ans;
}
inline int work(int x,int y) {
int len=0;
while (y) {
b[++len]=y%10,y/=10;
}
return dfs(len,f(x),1);
}
int main() {
memset(dp,-1,sizeof(dp));
int kase,CR7=0,a,b;
scanf("%d",&kase);
while (kase--) {
scanf("%d%d",&a,&b);
printf("Case #%d: %d\n",++CR7,work(a,b));
}
return 0;
}