P11557 [ROIR 2016] 有趣数字 (Day 2)

题目背景

翻译自 ROIR 2016 D2T3

题目描述

如果一个整数的各个数位按非递减顺序排列,我们称这个数是“有趣的”。例如,1145,2333,1377777 都是“有趣的”。

给定 L,R,求出 [L,R] 中有趣的数字的个数,对 10^{9}+7 取模。

输入格式

输入两行,每行一个数,分别是 L 和 R。保证 1≤L≤R≤10^{100}

输出格式

输出一个数,表示答案。

输入输出样例

输入 #1

1 100

输出 #1

54

说明/提示

子任务是否捆绑分值特殊性质
121L=1,R≤1000
2221≤L≤R≤10^{18}
324L=1,R=10^{k},其中 2≤k≤100
4331≤L≤R≤10^{100}

参考代码:

#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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值