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\n",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\n",qaq[i],ansb[qaq[i]]);
    }
//  puts("");
    for(int i=0;i<=9;i++) printf("%lld ",ansb[i]-ansa[i]);
}
//655 1044

 

posted @ 2018-07-26 22:32  米罗偕涯  阅读(376)  评论(0编辑  收藏  举报