天使的分裂

本文介绍了一种利用矩阵乘法高效计算特定整数序列和的方法。通过递推公式 Fn = F_{n-1}

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

Description

这里写图片描述

Input

一个整数NN

Output

一行,一个整数,表示第00天到第n天的评估函数的值的和。

Sample Input

Input 1
5

Input 2
666666

Input 3
2147483648

Data Constraint

这里写图片描述

Solution

在这里,Fi2Fi−2Fi1Fi−1可以代换FiFi

Fn=i=0nfifniFn=∑i=0nfi⋅fn−i

=i=2n(fi1+fi2)fni+f1fn1+f0fn=∑i=2n(fi−1+fi−2)⋅fn−i+f1⋅fn−1+f0⋅fn

=i=0n1fifni1+i=0n2fifni2+f1fn1+f0fnf0fn1=∑i=0n−1fi⋅fn−i−1+∑i=0n−2fi⋅fn−i−2+f1⋅fn−1+f0⋅fn−f0⋅fn−1

=Fn1+Fn2+fn=Fn−1+Fn−2+fn

然后用矩阵乘法就好了。时间复杂度OlogNO(logN)
注意特判00

Code

type arr=array[1..5,1..5] of int64;
const   mo=998244353;
var     n,xx:int64;
                i:longint;
        ans,f:arr;
procedure calc(var a:arr;b:arr);
var     i,j,k:longint;
        c:arr;
begin
        fillchar(c,sizeof(c),0);
    for i:=1 to 5 do
        for j:=1 to 5 do
            for k:=1 to 5 do
            c[i,j]:=(c[i,j]+a[i,k]*b[k,j] mod mo) mod mo;
    a:=c;
end;
procedure work(x:int64);
var     p:boolean;
begin
    p:=true;
    while x<>0 do begin
        if x mod 2=1 then begin
            if p then begin
                ans:=f;
                p:=false;
            end else calc(ans,f);
        end;
        calc(f,f);
        x:=x div 2;
    end;
end;
begin
    readln(n);
        if n=0 then begin
                writeln(1);
                exit;
        end;
    f[1,2]:=1;f[2,1]:=1;f[2,2]:=1;
    f[2,5]:=1;f[3,4]:=1;f[4,3]:=1;
    f[4,4]:=1;f[5,5]:=1;f[3,2]:=1;f[4,2]:=1;
    work(n);
        for i:=1 to 5 do xx:=(xx+ans[i,5]) mod mo;
        xx:=(xx+ans[2,5]) mod mo;
        writeln(xx);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值