题目描述
小迟喜欢上了一些数字。如果一个数字的十进制表示中,有大于等于1个1,或者有大于等于2个2,或者有大于等于3个3,或者有大于等于4个4,或者有大于等于5个5,或者有大于等于6个6,或者有大于等于7个7,或者有大于等于8个8,或者有大于等于9个9,小迟会认为这个数字是good number。
现在小迟想数一数在L到R之间(包含L和R)有多少个good number。
输入
一行两个数字L和R(0<L≤R<109)。
输出
一行,一个整数,表示good number的数量。
样例输入
复制样例数据
1 100
样例输出
21
来源/分类
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pa;
const ll mod=1e9+7;
#define lowbit(x) x&(-x)
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int l,r,len,ans;
int cnt[15];
void dfs(int x,int num)
{
if(num>r)
{
return;
}
if(x>len)
{
if(num>=l&&num<=r)
{
ans--;
}
}
else
{
for(int i=1;i<=9;i++)
{
cnt[i]++;
if(cnt[i]<i)
{
dfs(x+1,num*10+i);
}
cnt[i]--;
}
if(x!=1)
{
dfs(x+1,num*10);
}
}
}
int main()
{
scanf("%d %d",&l,&r);
ans+=r-l+1;
for(len=1;len<=9;len++)
{
dfs(1,0);
}
printf("%d\n",ans);
return 0;
}