您的位置:首页 > 其它

Gift_纪中1763_快速幂+高精加

2016-07-17 11:56 393 查看

Description



Input

  输入的第一行为一个整数t。

  接下来t行,每行包含九个自然数。

Output

  输出t行

  每行一个整数,表示2^a+2^b+2^c+2^d+2^e+2^f+2^g+2^h+i。

Hint

[数据规模]

  40% t<=1000

  100% t<=100000 a,b,c,d,e,f,g,h<=60 i<=9223372036854775808

解析

看到次方就想到了快速幂,大概算了一下发现最大数据刚好比qword大1,就上了高精加

后面发现可以打点……

code

var
a,b,c,d,e,f,g,h,t,k,tmp:longint;
num1,num2,num3:array[0..500]of longint;
st:ansistring;
ans,i:qword;
function pow(x:longint):qword;
var
qaq:qword;
begin
if x=0 then exit(1);
if x=1 then exit(2);
if x mod 2=0 then
begin
qaq:=pow(x div 2);
exit(qaq*qaq);
end
else
begin
qaq:=pow(x div 2);
exit(qaq*qaq*2);
end;
end;
begin
readln(t);
while t>0 do
begin
readln(a,b,c,d,e,f,g,h,i);
ans:=pow(a);
ans:=ans+pow(b);
ans:=ans+pow(c);
ans:=ans+pow(d);
ans:=ans+pow(e);
ans:=ans+pow(f);
ans:=ans+pow(g);
ans:=ans+pow(h);
fillchar(num1,sizeof(num1),0);
fillchar(num2,sizeof(num2),0);
fillchar(num3,sizeof(num3),0);
str(ans,st);
tmp:=0;
begin
num3[0]:=length(st);
for k:=length(st)downto 1 do
num1[length(st)-k+1]:=ord(st[k])-48;

str(i,st);
if length(st)>num3[0] then
num3[0]:=length(st);

for k:=length(st)downto 1 do
num2[length(st)-k+1]:=ord(st[k])-48;
for k:=1 to num3[0] do
begin
num3[k]:=(num2[k]+num1[k]+tmp)mod 10;
tmp:=(num2[k]+num1[k]+tmp)div 10;
end;
if tmp<>0 then
begin
inc(num3[0]);
num3[num3[0]]:=tmp;
end;
for k:=num3[0]downto 1 do write(num3[k]);
writeln;
end;
dec(t);
end;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: