题目描述
给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
输入输出格式
输入格式:
输入文件中仅包含一行两个整数a、b,含义如上所述。
输出格式:
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
输入输出样例
输入样例#1: 复制
1 99
输出样例#1: 复制
View Code
9 20 20 20 20 20 20 20 20 20
乍一看很简单
一开始想像吉哥那题想用node 来dfs
想复杂了
其实可以每次针对一个数 然后9次数位即可
一开始还算成有几个数满足条件QAQ
注意前导零的情况
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// const int N=30; ll dp[N][20][15]; ll a[N]; ll dfs(int pos,int pre,bool lead,bool limit,int flag) { if(!pos)return pre; if(!limit&&!lead&&dp[pos][pre][flag]!=-1)return dp[pos][pre][flag]; ll ans=0; int up=limit?a[pos]:9; rep(i,0,up) { ans+=dfs(pos-1,pre+((i==flag)&&(i||!lead)) ,lead&&i==0,limit&&i==a[pos],flag); } if(!limit&&!lead)dp[pos][pre][flag]=ans; return ans; } ll solve(ll x,int flag) { int pos=0; while(x) { a[++pos]=x%10; x/=10; } return dfs(pos,0,true,true,flag); } ll x,y; int main() { CLR(dp,-1); cin>>x>>y; rep(i,0,9) printf("%lld ",solve(y,i)-solve(x-1,i)); return 0; }