题目: | 小Q玩游戏——开采金币 | |
来源: | Tyvj 1316 | |
题目大意: | S次操作,可以建矿塔,可以采矿,采矿每次采已有矿塔数的矿,初始为0矿塔,求 最大采矿数。 | |
数据范围: | S<=10^100 | |
样例: | 1 | 0 |
做题思路: | 看题意很清晰,但我不是大牛,不知道这和高精度有什么直接关系?难道只是用高精 度来处理数?额。。原来是有个式子可以直接出解 Ans=(s/2)^2 | |
知识点: | 高精度乘除(万进制) |
var
a1,a2,a:array[0..70]of longint;
s,s1:string;
l:longint;
procedure init;
var
i,j:longint;
begin
readln(s);
l:=length(s);
j:=ldiv 4;
ifj*4<l then inc(j);
fori:=1 to j do
begin
ifl-i*4+1>0 then s1:=copy(s,l-i*4+1,4)
else s1:=copy(s,1,l-(i-1)*4);
val(s1,a1[i]);
end;
a1[0]:=j;
while (a1[0]>0)and(a1[a1[0]]=0) dodec(a1[0]);
end;
procedure print;
var
i:longint;
begin
while (a[a[0]]=0)and(a[0]>0) do dec(a[0]);
ifa[0]=0 then writeln('0')
else
begin
write(a[a[0]]);
for i:=a[0]-1 downto 1 do
case a[i] of
0..9:write('000',a[i]);
10..99:write('00',a[i]);
100..999:write('0',a[i]);
else write(a[i]);
end;
writeln;
end;
fillchar(a,sizeof(a),0);
end;
procedure minu;
var
i,k:longint;
begin
k:=0;
fori:=a[0] downto 1 do
begin
a[i]:=a[i]+k*10000;
k:=a[i] mod 4;
a[i]:=a[i] div 4;
end;
while a[a[0]]=0 do dec(a[0]);
end;
procedure mult;
var
i,j:longint;
begin
fillchar(a,sizeof(a),0);
fori:=1 to a1[0] do
forj:=1 to a2[0] do
begin
a[i+j-1]:=a1[i]*a2[j]+a[i+j-1];
a[i+j]:=a[i+j]+a[i+j-1] div 10000;
a[i+j-1]:=a[i+j-1] mod 10000;
end;
a[0]:=a1[0]+a2[0];
ifa[a[0]+1]>0 then inc(a[0]);
end;
begin
init;
if(a1[0]=1)and(a1[a1[0]]=1)then
begin
writeln('0');
halt;
end;
a2:=a1;
mult;
minu;
print;
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1316