列表

详情


NC20491. [ZJOI2010]COUNT 数字计数

描述

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

输入描述

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

输出描述

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

示例1

输入:

1 99

输出:

9 20 20 20 20 20 20 20 20 20

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 231ms, 内存消耗: 29980K, 提交时间: 2023-06-09 20:07:07

from functools import lru_cache
mod = int(1e9) + 7
@lru_cache(None)
def solve(n, ms):
    s = str(n)
    @lru_cache(None)
    def f(i,mask ,is_limit, is_num):
        if i == len(s):
            return mask
        res = 0
        if not is_num:
            res = f(i + 1, 0, False, False)
        low = 1 - int(is_num)
        up = int(s[i]) if  is_limit else 9
        for d in range(low, up + 1):
            if d == ms:
                res +=  f(i + 1, mask + 1, is_limit and d == up, True)
            else:
                res += f(i + 1, mask, is_limit and d == up, True)
        return res
    return f(0,0,True,False)


l, r = map(int,input().split())
for i in range(0, 10):
    print(solve(r, i) - solve(l - 1, i), end=" ")

C++ 解法, 执行用时: 3ms, 内存消耗: 444K, 提交时间: 2022-02-04 21:12:56

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll num(ll n){
    ll res=0;
    while (n)
        res++,n/=10;
    return res;
}
ll count (ll n,ll i){
    ll res=0,d=num(n);
    for(int j=1;j<=d;j++){
        ll p=pow(10,j-1),l=n/p/10,r=n%p,t=n/p%10;
        if(i) res+=l*p;
        if(!i&&l) res+=(l-1)*p;
        if((t>i)&&(i||l)) res+=p;
        if((t==i)&&(i||l)) res+=r+1;
    }
    return res;
}
int main()
{
    ll a,b;
    cin>>a>>b;
    for(int i=0;i<=9;i++)
        cout<<count(b,i)-count(a-1,i)<<" ";
}

上一题