【Luogu】P2602数字计数(数位DP)
数位DP好喵啊。自己yy两个小时的dfs:题解40行代码=10WA:10A。
md而且还不是完全理解题解是什么意思。
所以放题解链接。
#include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #include<cstring> using namespace std; inline long long read(){ long long num=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar(); } while(isdigit(ch)){ num=num*10+ch-'0'; ch=getchar(); } return num*f; } long long mul[20],f[20]; long long cnta[20],cntb[20]; void solve(long long x,long long *cnt){ int len=0;long long num[20]={0}; while(x){ num[++len]=x%10; x/=10; } for(int i=len;i;--i){ for(int j=0;j<=9;++j) cnt[j]+=f[i-1]*num[i]; for(int j=0;j<num[i];++j) cnt[j]+=mul[i-1]; long long num2=0; for(int j=i-1;j;--j) num2=num2*10+num[j]; cnt[num[i]]+=num2+1; cnt[0]-=mul[i-1]; } } int main(){ long long a=read(),b=read(); mul[0]=1; for(int i=1;i<=15;++i){ mul[i]=mul[i-1]*10; f[i]=10*f[i-1]+mul[i-1]; } solve(a-1,cnta);solve(b,cntb); for(int i=0;i<=9;++i) printf("%lld ",cntb[i]-cnta[i]); return 0; }