题目描述
给定两个正整数 a 和 b,求在 [a,b] 中的所有整数中,每个数码(digit)各出现了多少次。
输入格式
仅包含一行两个整数 a,b,含义如上所述。
输出格式
包含一行十个整数,分别表示 0∼9 在 [a,b] 中出现了多少次。
输入输出样例
输入 #1
1 99
输出 #1
9 20 20 20 20 20 20 20 20 20
说明/提示
数据规模与约定
- 对于 30% 的数据,保证 a≤b≤
;
- 对于 100% 的数据,保证 1≤a≤b≤
。
-
参考代码:
-
#include<bits/stdc++.h> #define int long long using namespace std; const int N=15,mod=1e9+7; int a[N],dp[N][20005]; int dfs(int pos,int sum,bool linit,bool qian0,int shu) { if(!pos)return sum; if(dp[pos][sum]>0&&!linit&&!qian0)return dp[pos][sum]; int js=linit?a[pos]:9; int ans=0; for(int i=0;i<=js;i++) ans=ans+dfs(pos-1,sum+(shu==0&&!qian0&&i==0|| shu&&shu==i),linit&i==js,qian0&&i==0,shu); if(!linit&&!qian0) dp[pos][sum]=ans; return ans; } int solve(int x,int y) { memset(dp,0,sizeof(dp)); if(x<0)return 0; int g=0; while(x>0) { g++; a[g]=x%10; x/=10; } return dfs(g,0,1,1,y); } signed main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int a,b; cin>>a>>b; for(int i=0;i<=9;i++) cout<<solve(b,i)-solve(a-1,i)<<" "; return 0; }