luogu P4999 烦人的数学作业 数位dp

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int t;
int l,r;
int q[N];
int dp[200][200];
int dfs(int poj,int sum,bool limit)
{
	if(!poj)
		return sum;
	if(!limit&&dp[poj][sum]>=0)
		return dp[poj][sum];
	int ans=0;
	int up=limit?q[poj]:9;
	for(int i=0;i<=up;i++)
		ans=(ans+dfs(poj-1,sum+i,limit&&i==q[poj])%mod)%mod;
	if(!limit)
		return dp[poj][sum]=ans;
	else
		return ans;
}
int solve(int x)
{
	int cnt=0;
	while(x)
	{
		q[++cnt]=x%10;
		x/=10;
	}
	return dfs(cnt,0,1)%mod;
}
signed main()
{
	memset(dp,-1,sizeof dp);
	cin>>t;
	while(t--)
	{
		cin>>l>>r;
		cout<<(solve(r)-solve(l-1)+mod)%mod<<endl;
	}
	return 0;
}
posted @ 2020-05-08 00:38  晴屿  阅读(112)  评论(0编辑  收藏  举报