【洛谷 2602】数字计数

 

题目描述

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

输入格式

输入文件中仅包含一行两个整数a、b,含义如上所述。

输出格式

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

输入输出样例

输入 #1
1 99
输出 #1
9 20 20 20 20 20 20 20 20 20

说明/提示

30%的数据中,a<=b<=10^6;

100%的数据中,a<=b<=10^12。

 

题解:数位DP,见代码吧

#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef long long ll;
ll a,b;
ll ten[20],f[20];
ll fa[20],fb[20];
void solve(ll x,ll *f){
    ll num[20]={0};
    int len=0;
    while(x){
        num[++len]=x%10;
        x=x/10;
    } 
    for(int i=len;i>=1;i--){
        for(int j=0;j<=9;j++)
        f[j]+=f[i-1]*num[i];
        for(int j=0;j<num[i];j++)
        f[j]+=ten[i-1];
        ll num2=0;
        for(int j=i-1;j>=1;j--)
            num2=num2*10+num[j];
        f[num[i]]+=num2+1;
        f[0]-=ten[i-1];
    } 
}

void Yao_Chen_Lai_Le(){
    scanf("%lld %lld",&a,&b);
    ten[0]=1;
    for(int i=1;i<=15;i++){
        f[i]=f[i-1]*10+ten[i-1];
        ten[i]=10*ten[i-1];
    }
    solve(a-1,fa); solve(b,fb);
    for(int i=0;i<=9;i++)
        printf("%lld ",fb[i]-fa[i]);
}
int main(){
    freopen("2602.in","r",stdin);
    freopen("2602.out","w",stdout);
    Yao_Chen_Lai_Le();
    return 0;
}

 

posted @ 2019-07-26 11:30  #Cookies#  阅读(262)  评论(0编辑  收藏  举报