NC20491. [ZJOI2010]COUNT 数字计数
描述
输入描述
输入文件中仅包含一行两个整数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)<<" "; }