8.2 stair

1.【通天阶梯】 stair

【题目描述】

有一个很长很长的通天阶梯,有n级,现在你想要走完这个阶梯。

开始时你在0级,你可以一步走一级或两级。最后一步必须恰好落到第n级上

请你求出有多少种行走方案可以走完这个阶梯。为了降低编程复杂度,只需输出最后的结果mod 123456的值即可

【输入格式】

第一行:

一个整数n

【输出格式】

一行:最后的结果

 

【数据范围】

50%的数据:n<=2^20;

100%的数据:n<=2^64-1;

【样例输入】

2

【样例输出】

2

 

思路:由于数据范围大,所以要用矩阵乘法和幂加速优化

程序:

 type
  arr=array[1..2,1..2]of int64;
var
  f:array[1..2]of longint;
  b:arr;
  n:qword;
procedure ab;
var
  c:array[1..2]of longint;
  i,k,j:longint;
begin
  fillchar(c,sizeof(c),0);
  for k:=1 to 2 do
   for j:=1 to 2 do
    c[j]:=(c[j]+f[k]*b[k,j])mod 123456;
  f:=c;
end;
procedure bb;
var
  c:arr;
  i,j,k:longint;
begin
  fillchar(c,sizeof(c),0);
  for i:=1 to 2 do
   for k:=1 to 2 do
    for j:=1 to 2 do
     c[i,j]:=(c[i,j]+b[i,k]*b[k,j])mod 123456;
  b:=c;
end;
procedure doit;
begin
  readln(n);
  if n=1 then
   begin
     writeln(1);
     exit;
   end;
  if n=2 then
   begin
     writeln(2);
     exit;
   end;
  f[1]:=1;f[2]:=2;
  b[1,1]:=0;b[1,2]:=1;
  b[2,1]:=1;b[2,2]:=1;
  dec(n,2);
  while n>0 do
   begin
     if odd(n) then ab;
     bb;
     n:=n>>1;
   end;
  writeln(f[2]);
end;
begin
  assign(input,'stair.in');
  assign(output,'stair.out');
  reset(input);
  rewrite(output);
  doit;
  close(input);
  close(output);
end.

反思:好好听讲。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值