Description
Input
一个整数 N N 。
Output
一行,一个整数,表示第 0 0 天到第天的评估函数的值的和。
Sample Input
Input 1
5
Input 2
666666
Input 3
2147483648
Data Constraint
Solution
在这里,
Fi−2
F
i
−
2
和
Fi−1
F
i
−
1
可以代换
Fi
F
i
。
Fn=∑i=0nfi⋅fn−i
F
n
=
∑
i
=
0
n
f
i
⋅
f
n
−
i
=∑i=2n(fi−1+fi−2)⋅fn−i+f1⋅fn−1+f0⋅fn
=
∑
i
=
2
n
(
f
i
−
1
+
f
i
−
2
)
⋅
f
n
−
i
+
f
1
⋅
f
n
−
1
+
f
0
⋅
f
n
=∑i=0n−1fi⋅fn−i−1+∑i=0n−2fi⋅fn−i−2+f1⋅fn−1+f0⋅fn−f0⋅fn−1
=
∑
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
=Fn−1+Fn−2+fn
=
F
n
−
1
+
F
n
−
2
+
f
n
然后用矩阵乘法就好了。时间复杂度 O(logN) 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.