• P2602 [ZJOI2010]数字计数


    题目描述

    给定两个正整数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<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    ll dp[20][20],a,b;
    
    int num[20];
    
    ll dfs(int deep,bool limit,bool zero,int sum,int tmp) {
        if(deep == 0) return sum;
        if(!limit&&zero&&dp[deep][sum]!=-1) return dp[deep][sum];
        ll ans = 0;
        int up = 9;
        if(limit) up = num[deep];
        for(int i=0;i<=up;i++) {
            ans+=dfs(deep-1,limit&&(i==up),zero||i,sum+((zero||i)&&(tmp==i)),tmp);
        }
        if(!limit&&zero) dp[deep][sum]=ans;
        return ans;
    }
    
    ll work(ll x ,int d) {
        memset(dp,-1,sizeof(dp));
        int cnt = 0;
        while(x) {
            num[++cnt] = x % 10;
            x /= 10;
        }
        return dfs(cnt,1,0,0,d);
    }
    
    int main() {
        scanf("%lld%lld",&a,&b);
        for(int i = 0;i <= 9;i ++) {
            printf("%lld ",work(b,i)-work(a-1,i));
        }
        return 0;
    }
  • 相关阅读:
    JDBC操作MySQL
    MySQL-SQL语句
    MySQL-环境安装、配置、卸载、系统介绍
    JavaSE-单元测试、反射、注解
    JavaSE-Stream、方法引用
    JavaSE-函数式编程接口
    JavaSE-网络编程
    Document
    Document
    Document
  • 原文地址:https://www.cnblogs.com/plysc/p/11008395.html
Copyright © 2020-2023  润新知