bzoj1833数字计数
Posted cn-suqingnian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1833数字计数相关的知识,希望对你有一定的参考价值。
找$[1$ ~ $a-1]$和$[1$ ~ $b]$中各数码出现的次数之后相减就是答案
上代码:
/************************************************************** Problem: 1833 User: zhangheran Language: C++ Result: Accepted Time:0 ms Memory:1292 kb ****************************************************************/ #include<iostream> #include<cstdio> #include<algorithm> using namespace std; long long a,b; long long f[17]; long long dp[17]; long long ansa[17]; long long ansb[17]; long long tot; long long qwq[17]; long long qaq[17]; int lena,lenb; int main() { // freopen("1.in","r",stdin); // freopen("1.out","w",stdout); scanf("%lld%lld",&a,&b); dp[0]=1; for(int i=1;i<=15;i++) f[i]=f[i-1]*10+dp[i-1], dp[i]=dp[i-1]*10; a--; while(a) qwq[++lena]=a%10,a/=10; while(b) qaq[++lenb]=b%10,b/=10; for(int i=lena;i>=1;i--){ long long now=0; for(int j=0;j<=9;j++) ansa[j]+=qwq[i]*f[i-1]; for(int j=0;j<qwq[i];j++) ansa[j]+=dp[i-1]; for(int j=i-1;j>0;j--) now*=10,now+=qwq[j]; ansa[qwq[i]]+=now+1; ansa[0]-=dp[i-1]; // printf("%lld %lld ",qwq[i],ansa[qwq[i]]); } // puts(""); for(int i=lenb;i>=1;i--){ // printf("%lld ",qaq[i]); long long now=0; for(int j=0;j<=9;j++) ansb[j]+=qaq[i]*f[i-1]; for(int j=0;j<qaq[i];j++) ansb[j]+=dp[i-1]; for(int j=i-1;j>0;j--) now*=10,now+=qaq[j]; ansb[qaq[i]]+=now+1; ansb[0]-=dp[i-1]; // printf("%lld %lld ",qaq[i],ansb[qaq[i]]); } // puts(""); for(int i=0;i<=9;i++) printf("%lld ",ansb[i]-ansa[i]); } //655 1044
以上是关于bzoj1833数字计数的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
bzoj1833: [ZJOI2010]count 数字计数 && codevs1359 数字计数
[BZOJ1833][ZJOI2010]count 数字计数