刚学数位dp,最简单的题,求助
查看原帖
刚学数位dp,最简单的题,求助
434015
Calanosay楼主2021/5/3 10:44
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=25;
const int mod=1e9+7;
int f[maxn][maxn];
void init(){
    for(int i=0;i<10;i++)   f[1][i]=i;
    for(int i=2;i<maxn;i++)
        for(int j=0;j<10;j++)
            for(int k=0;k<10;k++)
                f[i][j]=(f[i][j]+(j+f[i-1][k])+mod)%mod;
}
int dp(int num){
    int res=0;
    vector<int> g;
    while(num)  g.push_back(num%10),num/=10;
    for(int i=g.size()-1;i>=0;i--){
        int x=g[i];
        for(int j=0;j<x;j++)    res=(res+f[i+1][j]+mod)%mod;
        for(int j=i;j>0;j--)    res=(res+x*g[j-1]*(int)pow(10,j-1)+mod)%mod;
        res=(res+x+mod)%mod;
    }
    return res%mod;
}
signed main(){
    int t;
    cin>>t;
    init();
    while(t--){
        int l,r;
        cin>>l>>r;
        cout<<((dp(r)-dp(l-1))%mod+mod)%mod<<endl;
    }
}

递推写法

2021/5/3 10:44
加载中...