都用的暴力,要是数再大一点呢?1e9的数据呢?所以我练了练手,数位dp一波,嘻嘻嘻(注意签到0的情况哦)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
int l,r;
int a[12],vis[12];
int dp[12][100010];
int dfs(int pos,int sum,int flag,int flag0)
{
if(pos==-1)
return 1;
if(!flag0&&!flag&&dp[pos][sum]!=-1)
return dp[pos][sum];
int up=flag?a[pos]:9;
int ans=0;
for(int i=0;i<=up;i++)
{
if(!flag0)
{
if(i==0)
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],0);
else if(!vis[i])
{
vis[i]=1;
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],1);
vis[i]=0;
}
}
else if(!vis[i])
{
vis[i]=1;
ans+=dfs(pos-1,sum+1,flag&&i==a[pos],1);
vis[i]=0;
}
}
if(!flag&&!flag0)
dp[pos][sum]=ans;
return ans;
}
int solve(int x)
{
memset(vis,0,sizeof(vis));
int pos=0;
while(x>0)
{
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,0,1,0);
}
int main()
{
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
while(t--)
{
scanf("%d%d",&l,&r);
printf("%d\n",solve(r)-solve(l-1));
}
return 0;
}