天使的分裂

1 篇文章 0 订阅

Description

这里写图片描述

Input

一个整数 N N

Output

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

Sample Input

Input 1
5

Input 2
666666

Input 3
2147483648

Data Constraint

这里写图片描述

Solution

在这里, Fi2 F i − 2 Fi1 F i − 1 可以代换 Fi F i

Fn=i=0nfifni F n = ∑ i = 0 n f i ⋅ f n − i

=i=2n(fi1+fi2)fni+f1fn1+f0fn = ∑ i = 2 n ( f i − 1 + f i − 2 ) ⋅ f n − i + f 1 ⋅ f n − 1 + f 0 ⋅ f n

=i=0n1fifni1+i=0n2fifni2+f1fn1+f0fnf0fn1 = ∑ i = 0 n − 1 f i ⋅ f n − i − 1 + ∑ i = 0 n − 2 f i ⋅ f n − i − 2 + f 1 ⋅ f n − 1 + f 0 ⋅ f n − f 0 ⋅ f n − 1

=Fn1+Fn2+fn = F n − 1 + F n − 2 + f n

然后用矩阵乘法就好了。时间复杂度 OlogN O ( l o g N )
注意特判 0 0 <script type="math/tex" id="MathJax-Element-17">0</script>。

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、付费专栏及课程。

余额充值