int dp[20][10005];
int digit[20];
int getvalue(int a)
{
int i=0;
int ans=0;
while(a){
ans=ans+((a%10)*(1<<i));
i++;
a/=10;
}
return ans;
}
int dfs(int pos,int state,int limit)
{
if(state<0)return 0;
if(pos==0)return state>=0;
int ans=0;
int up=limit?digit[pos]:9;
for(int i=0;i<=up;i++){
ans+=dfs(pos-1,state-i*(1<<(pos-1)),limit&&i==digit[pos]);
}
if(!limit)dp[pos][state]=ans;
return ans;
}
int solve(int b,int a)
{
int pos=0;
while(b){
digit[pos++]=b%10;
b/=10;
}
return dfs(pos,getvalue(a),1);
}
int main()
{
int t;
cin>>t;
while(t--){
memset(dp,-1,sizeof(dp));
cin>>a>>b;
cout<<solve(b,a);
}
return 0;
}
hdu4734
最新推荐文章于 2020-02-07 11:05:28 发布