题目描述
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
输入输出格式
输入格式:输入文件中仅包含一行两个整数a、b,含义如上所述。
输出格式:输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
输入输出样例
说明
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; }