【Luogu】P2602数字计数(数位DP)

  题目链接

  数位DP好喵啊。自己yy两个小时的dfs:题解40行代码=10WA:10A。

  md而且还不是完全理解题解是什么意思。

  所以放题解链接

  

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<cstring>
using namespace std;
inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num*f;
}

long long mul[20],f[20];
long long cnta[20],cntb[20];

void solve(long long x,long long *cnt){
    int len=0;long long num[20]={0};
    while(x){
        num[++len]=x%10;
        x/=10;
    }
    for(int i=len;i;--i){
        for(int j=0;j<=9;++j)        cnt[j]+=f[i-1]*num[i];
        for(int j=0;j<num[i];++j)    cnt[j]+=mul[i-1];
        long long num2=0;
        for(int j=i-1;j;--j)        num2=num2*10+num[j];
        cnt[num[i]]+=num2+1;
        cnt[0]-=mul[i-1];
    }
}

int main(){
    long long a=read(),b=read();
    mul[0]=1;
    for(int i=1;i<=15;++i){
        mul[i]=mul[i-1]*10;
        f[i]=10*f[i-1]+mul[i-1];
    }
    solve(a-1,cnta);solve(b,cntb);
    for(int i=0;i<=9;++i)    printf("%lld ",cntb[i]-cnta[i]);
    return 0;
}

 

posted @ 2018-01-15 14:20  Konoset  阅读(245)  评论(0编辑  收藏  举报