P2602 [ZJOI2010] 数字计数
题解
abcdefg等价于求
a000000+b00000+c0000+d000+e00+f0+g
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ten[14]={0};
ll f[14]={0};
ll a1[14]={0},a2[14]={0};
void solve1(ll now)
{
int len=0;
ll pre=0;
while(now)
{
++len;
int top=now%10;
for(int i=0;i<top;i++)
{
a1[i]+=ten[len-1];
for(int i=0;i<=9;i++) a1[i]+=f[len-1];
}
a1[top]+=pre+1;
pre=top*ten[len-1]+pre;
now/=10;
}
for(int i=len;i>=1;i--)
{
a1[0]-=ten[i-1];
}
}
void solve2(ll now)
{
int len=0;
ll pre=0;
while(now)
{
++len;
int top=now%10;
for(int i=0;i<top;i++)
{
a2[i]+=ten[len-1];
for(int i=0;i<=9;i++) a2[i]+=f[len-1];
}
a2[top]+=pre+1;
pre=top*ten[len-1]+pre;
now/=10;
}
for(int i=len;i>=1;i--)
{
a2[0]-=ten[i-1];
}
}
int main()
{
ten[0]=1;
for(int i=1;i<=13;i++) ten[i]=ten[i-1]*10LL;
f[1]=1;
for(int i=2;i<=13;i++) f[i]=10LL*f[i-1]+ten[i-1];
ll a,b;
cin>>a>>b;
solve1(b);
solve2(a-1);
for(int i=0;i<=9;i++) printf("%lld ",a1[i]-a2[i]);
return 0;
}

浙公网安备 33010602011771号