您的位置:首页 > 其它

BZOJ1833: [ZJOI2010]count 数字计数

2014-08-16 17:11 369 查看

1833: [ZJOI2010]count 数字计数

Time Limit: 3 Sec Memory Limit: 64 MB
Submit: 1250 Solved: 574
[Submit][Status]

Description

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

Input

输入文件中仅包含一行两个整数a、b,含义如上所述。

Output

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

Sample Input

1 99

Sample Output

9 20 20 20 20 20 20 20 20 20

HINT

30%的数据中,a<=b<=10^6;
100%的数据中,a<=b<=10^12。

Source

Day1

题解:红书上的原题。。。可是答案错了。。。自己又yy了好久
关键语句是这里:

for i:=n downto 1 do
begin
for j:=0 to 9 do inc(a[j],mi[i-2]*(i-1)*c[i]);
for j:=0 to c[i]-1 do inc(a[j],mi[i-1]);
inc(a[c[i]],x mod mi[i-1]+1);
end;
for i:=1 to n do s[i]:='1';val(s,x);
dec(a[0],x);


主要步骤是:

1. 0-9的使用次数增加平均使用的次数

2. 0-c[i]-1的使用次数增加作为最高位的使用次数

3. c[i]的使用次数增加 x mod mi[i-1] 其中mi[i]表示10^i

4.循环结束后减去多用的0的个数

代码:

var a,b,c,mi:array[-1..15] of int64;
s:ansistring;
x,y:int64;
i:longint;
procedure calc(x:int64);
var i,j,n:longint;
begin
fillchar(a,sizeof(a),0);
str(x,s);n:=length(s);
for i:=1 to n do c[i]:=ord(s[n+1-i])-48;
for i:=n downto 1 do
begin
for j:=0 to 9 do inc(a[j],mi[i-2]*(i-1)*c[i]);
for j:=0 to c[i]-1 do inc(a[j],mi[i-1]);
inc(a[c[i]],x mod mi[i-1]+1);
end;
for i:=1 to n do s[i]:='1';val(s,x);
dec(a[0],x);
end;
procedure main;
begin
mi[0]:=1;
for i:=1 to 13 do mi[i]:=mi[i-1]*10;
readln(x,y);
calc(y);
for i:=0 to 9 do b[i]:=a[i];
calc(x-1);
write(b[0]-a[0]);
for i:=1 to 9 do write(' ',b[i]-a[i]);
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
main;
close(input);close(output);
end.


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: