#9169. 猪分身

传统 1000 ms 256 MiB
标准 IO
文本比较 username 标签

题目描述

猪学会了分身术,他正在数轴上练习这一术法。

初始时(第 00 秒),猪(相当于 11 个猪分身)位于原点(x=0x=0)处。

11 个第 tt 秒位于 x=ix=i 处的猪分身会在第 tt 秒结束后、第 t+1t+1 秒开始前消失,同时产生 66 个猪分身,其中:

  • 11 个猪分身会诞生在 x=i+1x=i+1 处。
  • 22 个猪分身会诞生在 x=i+2x=i+2 处。
  • 33 个猪分身会诞生在 x=i+3x=i+3 处。

猪想知道,经过 nn 秒后,有多少个猪分身曾在 x=n1x=n-1 处停留过。

形式化地,设第 tt 秒位于 x=n1x=n-1 处的猪分身有 ftf_t 个,求 t=0nft\sum\limits_{t=0}^nf_t

答案对 998244353998244353 取模。

我们在题目的最后给出了一定的提示。

输入格式

一行一个整数 nn2n10182\le n\le10^{18})。

输出格式

一行一个整数,表示答案对 998244353998244353 取模后的结果。

样例

样例 1

输入

4

输出

8

解释

下面用 [g0,g1,g2,g3,][g_0,g_1,g_2,g_3,\cdots] 来表示 x=ix=i 处有 gig_i 个猪分身(i=0,1,2,3,i=0,1,2,3,\cdots):

  • 00 秒,情况是 [1,0,0,0,][1,0,0,0,\cdots]
  • 11 秒,情况是 [0,1,2,3,][0,1,2,3,\cdots]
  • 22 秒,情况是 [0,0,1,4,][0,0,1,4,\cdots]
  • 33 秒,情况是 [0,0,0,1,][0,0,0,1,\cdots]
  • 44 秒,情况是 [0,0,0,0,][0,0,0,0,\cdots]

所以,答案是 0+3+4+1+0=80+3+4+1+0=8

样例 2

输入

10

输出

1331

样例 3

输入

100

输出

252917600

数据范围与提示

模意义下的加减乘法

pp 是正整数,容易证明:

(a+b)modp=((amodp)+(bmodp))modp(ab)modp=((amodp)(bmodp)+p)modp(a×b)modp=((amodp)×(bmodp))modp\begin{aligned} (a+b)\bmod p&=\big((a\bmod p)+(b\bmod p)\big)\bmod p\\ (a-b)\bmod p&=\big((a\bmod p)-(b\bmod p)+p\big)\bmod p\\ (a\times b)\bmod p&=\big((a\bmod p)\times(b\bmod p)\big)\bmod p \end{aligned}

快速幂

bb 是正整数,现欲求 aba^b

bb 很大,则做 O(b)O(b) 次乘法是不可接受的。

bb 的二进制表示为 ctct1c0\overline{c_tc_{t-1}\cdots c_0},其中 t=log2bt=\lfloor\log_2b\rfloorci=b2imod2c_i=\left\lfloor\dfrac{b}{2^i}\right\rfloor\bmod2

a2i+1=a2i×a2ia^{2^{i+1}}=a^{2^i}\times a^{2^i},先求出 a20,a21,,a2ta^{2^0},a^{2^1},\cdots,a^{2^t},则

ab=i{jcj=1}a2ia^b=\prod_{i\in\{j\mid c_j=1\}}a^{2^i}

这样,就只需要做 O(logb)O(\log b) 次乘法。