-
[1619] 递增数字
- 时间限制: 1000 ms 内存限制: 65535 K
- 问题描述
-
我们把数字的高位到低位逐渐变大的数字叫作递增数字,形如0,12344,35799。现在给出区间L和R,请你计算L到R内递增数字的个数。因为个数比较多,将答案输出mod (1e9+7)后输出。
- 输入
-
多组输入,每组输入两个数,分别代表L和R。
数据范围:0<=L<=R<=10^100。 - 输出
-
每组输出一行,表示答案个数mod 1e9+7后的值。
- 样例输入
-
13 24 93 111 12345 54321
- 样例输出
-
10 2 952
- 提示
-
无
- 来源
-
2015苏州大学ACM-ICPC集训队选拔赛(1)
注意答案要取模
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 1e2 +10;
const int mod = 1e9 + 7;
char l[N],r[N];
int dp[N][15],num[N];
int dfs(int pos,int pre,bool limit){
if(pos==-1) return 1;
if(!limit && dp[pos][pre]!=-1) return dp[pos][pre];
int up = limit ? num[pos] : 9;
int ans = 0;
for(int i=pre;i<=up;i++){
ans += dfs(pos-1,i,limit && i==up);
ans %= mod;
}
if(!limit && dp[pos][pre]==-1) dp[pos][pre] = ans % mod;
return ans;
}
int slove(char s[]){
int len = (int)strlen(s);
for(int i=len-1;i>=0;i--){
num[len-1-i] = s[i] - '0';
}
return dfs(len-1,0,true);
}
int main()
{
while(scanf("%s%s",l,r)!=EOF){
memset(dp,-1,sizeof dp);
int add = 1;
for(int i=1;l[i];i++){
if(l[i]<l[i-1]) add = 0;
}
printf("%d\n",(slove(r) - slove(l) + add + mod) % mod);
}
return 0;
}