zoukankan      html  css  js  c++  java
  • 【洛谷 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;
    }
  • 相关阅读:
    vue 开发环境搭建
    签名算法
    MySQL explain执行计划优化
    查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况
    jenkins 配置
    CSS布局
    《JavaScript 代码优化指南》
    JavaScript 跨域漫游
    iFrame 功能详解
    粘性的底部布局
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11249213.html
Copyright © 2011-2022 走看看