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

    xiaoxiao2021-04-17  37

    传送门 高精度模板题。

    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.
    转载请注明原文地址: https://ju.6miu.com/read-673606.html

    最新回复(0)