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

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值