bzoj1265: [AHOI2006]斐波卡契的兔子(kacci)

这是一篇关于使用高精度模板解决[AHOI2006]斐波卡契的兔子(kacci)问题的博客,详细探讨了如何应用高精度算法来处理这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门
高精度模板题。

type arr=array [0..5005] of int64;
var
  x,y1,y2,y3,z1,z2,z3,bas,ans:arr;
  s:ansistring;
  sum,i,n,j:longint;
  a,b,c,modd:int64;
procedure jia(var a:arr; b,c:arr);
  var i:longint;
  begin
    fillchar(a,sizeof(a),0);
    if (b[0]>c[0]) then a[0]:=b[0] else a[0]:=c[0];
    for i:=1 to a[0] do a[i]:=b[i]+c[i];
    for i:=1 to a[0] do begin
      inc(a[i+1],a[i] div modd);
      a[i]:=a[i] mod modd;
    end;
    if (a[a[0]+1]<>0) then inc(a[0]);
  end;
procedure cheng(var a:arr; b:arr; c:int64);
  var i:longint;
  begin
    a:=b;
    for i:=1 to a[0] do a[i]:=a[i]*c;
    for i:=1 to a[0] do begin
      inc(a[i+1],a[i] div modd);
      a[i]:=a[i] mod modd;
    end;
    if (a[a[0]+1]<>0) then inc(a[0]);
  end;
procedure chu(var a:arr; b:arr);
  var i:longint; x:int64;
  begin
    a:=b; x:=0;
    for i:=a[0] downto 1 do begin
      x:=x*modd+a[i];
      a[i]:=x div 2;
      x:=x mod 2;
    end;
    if (a[a[0]]=0) then dec(a[0]);
  end;
procedure jian(var a:arr; b,c:arr);
  var i:longint;
  begin
    fillchar(a,sizeof(a),0);
    a[0]:=b[0];
    for i:=1 to a[0] do a[i]:=b[i]-c[i];
    for i:=1 to a[0] do if (a[i]<0) then begin
      a[i]:=a[i]+modd; a[i+1]:=a[i+1]-1;
    end;
    while (a[0]<>0) and (a[a[0]]=0) do dec(a[0]);
  end;
procedure print(a:arr);
  var i:longint;
  begin
    write(a[a[0]]);
    for i:=a[0]-1 downto 1 do begin
      if (a[i]<100000000) then write(0);
      if (a[i]<10000000) then write(0);
      if (a[i]<1000000) then write(0);
      if (a[i]<100000) then write(0);
      if (a[i]<10000) then write(0);
      if (a[i]<1000) then write(0);
      if (a[i]<100) then write(0);
      if (a[i]<10) then write(0);
      write(a[i]);
    end;
  writeln;
  end;
function big(a,b:arr):longint;
  var i:longint;
  begin
    if (a[0]>b[0]) then exit(1);
    if (a[0]<b[0]) then exit(0);
    for i:=a[0] downto 1 do begin
      if (a[i]>b[i]) then exit(1);
      if (a[i]<b[i]) then exit(0);
    end;
    exit(1);
  end;
begin
  readln(a,b,c,n); modd:=1000000000;
  bas[0]:=1; bas[1]:=1; y1:=bas;
  for i:=1 to n do begin
    cheng(z1,y1,a);
    cheng(z2,y2,b);
    cheng(z3,y3,c);
    jia(z1,z1,z2);
    jia(z1,z1,z3);
    jia(y3,y3,y2);
    y2:=y1; y1:=z1;
  end;
  jia(y3,y3,y1);
  jia(y3,y3,y2);
  print(y3);
  readln(s);
  x[0]:=length(s);
  fillchar(y2,sizeof(y2),0);
  for i:=1 to x[0] do x[x[0]-i+1]:=ord(s[i])-48;
  for i:=1 to (x[0]-1) div 9+1 do
    for j:=0 downto -8 do y2[i]:=y2[i]*10+x[i*9+j];
  y2[0]:=(x[0]-1) div 9+1;
  jian(y2,y2,bas);
  sum:=0;
  while big(y2,y3)=1 do
    begin inc(sum); cheng(y3,y3,2); end;
  ans[0]:=0;
  for i:=1 to sum do begin
    chu(y3,y3); cheng(ans,ans,2);
    if big(y2,y3)=1 then begin jian(y2,y2,y3); jia(ans,ans,bas); end;
  end;
  jia(ans,ans,bas);
  print(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值