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.