题目背景
翻译自 ROIR 2016 D2T3。
题目描述
如果一个整数的各个数位按非递减顺序排列,我们称这个数是“有趣的”。例如,1145,2333,1377777 都是“有趣的”。
给定 L,R,求出 [L,R] 中有趣的数字的个数,对 +7 取模。
输入格式
输入两行,每行一个数,分别是 L 和 R。保证 1≤L≤R≤。
输出格式
输出一个数,表示答案。
输入输出样例
输入 #1
1 100
输出 #1
54
说明/提示
子任务 | 是否捆绑 | 分值 | 特殊性质 |
---|---|---|---|
1 | 是 | 21 | L=1,R≤1000 |
2 | 否 | 22 | 1≤L≤R≤ |
3 | 否 | 24 | L=1,R= |
4 | 否 | 33 | 1≤L≤R≤ |
参考代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105,mod=1e9+7;
int a[N],dp[N][15];
int dfs(int pos,int sum,bool linit)
{
if(!pos)return 1;
if(dp[pos][sum]>0&&!linit)return dp[pos][sum];
int js=linit?a[pos]:9;
int ans=0;int flag=0;
for(int i=sum;i<=js;i++)
{
ans=(ans+dfs(pos-1,i,linit&i==js))%mod;flag=1;
}
if(!linit&&flag) dp[pos][sum]=ans;
return ans;
}
int solve(string &x)
{
if(x=="0") return 0;
int g=x.size();
for(int i=0;i<g;i++)
a[g-i]=x[i]-'0';
return dfs(g,0,1);
}
int check(string &x)
{
int h=x.size();
for(int i=0;i<h-1;i++)
if(x[i]>x[i+1])
return 0;
return 1;
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
string a,b;
cin>>a>>b;
cout<<(solve(b)-solve(a)+check(a)+mod)%mod<<'\n';
return 0;
}