dp[i][j]记录第i位为j时在非限制条件下的符合条件数的个数
那么在记忆化搜索中标记当前状态是否有限制,当前状态下是否为0,因为最终如果非0要返回1,是0返回0.因为最终要求的数A的取值范围不包括0
那么求取时直接算取get(m)和get(n-1)即可求解
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <iostream>
#define MAX 15
using namespace std;
int t,n,m;
int dp[MAX][MAX];
int bit[MAX];
int cnt;
int dfs ( int len , int pos , int flag , int zero )
{
int ans = 0;
if ( len == 0 ) return zero?0:1;
if ( ~dp[len][pos]&&!flag ) return dp[len][pos];
int lim = flag?bit[len]:9;
if ( zero ) ans += dfs ( len-1 , 0 , flag&&(0==lim) , 1 );
for ( int i = 1 ; i <= lim ; i++ )
{
if ( zero )
ans += dfs ( len-1 , i , flag&&(i==lim) , 0 );
else if ( pos%i == 0 )
ans += dfs ( len-1 , i , flag&&(i==lim) , 0 );
}
if ( !flag )
dp[len][pos] = ans;
return ans;
}
int get ( int num )
{
cnt = 0;
while ( num )
{
bit[++cnt] = num%10;
num /= 10;
}
return dfs ( cnt , 0 , 1 , 1 );
}
int main ( )
{
scanf ( "%d" , &t );
while ( t-- )
{
scanf ( "%d%d" , &n , &m );
memset ( dp , -1 , sizeof ( dp ) );
printf ( "%d\n" , get( m ) - get (n-1) );
}
}