数位DP模板

数位DP模板

//求l~r所有数的数位和之和
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int a[25],len;
int dp[25][2][200];
int dfs(int pos,int limit,int lead,int sum){
    if(pos==0)return sum;
    if(!limit && dp[pos][lead][sum]!=-1)return dp[pos][lead][sum];
    int maxx=limit?a[pos]:9;
    int ans=0;
    for(int i=0;i<=maxx;i++){
        ans=(ans+dfs(pos-1,limit&&i==maxx,lead&&i==0,sum+i))%mod;
    }
    if(!limit)dp[pos][lead][sum]=ans;
    return ans;
}
int solve(ll x){
    len=0;
    while(x){
        a[++len]=x%10;
        x/=10;
    }
    return dfs(len,1,1,0);
}
int main () {
    memset(dp,-1,sizeof dp);
    int T;
    scanf("%d",&T);
    while(T--){
        ll l,r;
        scanf("%lld%lld",&l,&r);
        int ans=solve(r)-solve(l-1);
        while(ans<0)ans+=mod;
        ans%=mod;
        printf("%d\n",ans);
    }
}
posted @ 2020-11-18 16:33  UCPRER  阅读(102)  评论(0编辑  收藏  举报