假設$fib(n)$為斐波那契數列的第 $n$ 項,其中$fib(0)=0,fib(1)=1$,且$fib(n)=fib(n-1)+fib(n-2),(n > 1)$。 假設$s$是乙個可重集合$\$,$f(s)$ 定義為$f(s)=\sum_[fib(\sum_s)]$ 有乙個陣列$a_1,a_2, \cdots ,a_n$,牛妹會對陣列進行$q$次操作,每次操作可能是以下兩種 操作中的一種: 1. 把$a_p$變為$v$; 2. 計算 $\sum_^r \sum_^r f(\,\cdots,a_j)\})$。 對於每個操作 2,輸出答案模 $998244353$。
題目要求求出下式的值並支援修改操作:
$$\sum_^r \sum_^r f( \, \cdots ,a_j \})$$
其中$f(s)=\sum_[fib(\sum_s)]$
設$g(n)=fib^2(n)$也可以遞推,遞推公式為$g(n)=2g(n-1)+2g(n-2)-g(n-3)$(證明方法:使用通項公式硬算)
可以用矩陣寫出:
$$\begin
g(n)\\
g(n-1)\\
g(n-2)
\end
=\begin
2 & 2 & -1\\
1 & 0 & 0\\
0 & 1 & 0
\end
\begin
g(n-1) \\
g(n-2) \\
g(n-3)
\end$$
然後換成向量:
$$\vec=a\vec}=a^n\vec$$
那麼$\vec=\sum_\vec}$
考慮向$s$中加入乙個數$a$,可以得到$\vec)} = \vec + \sum_\vec} = \vec + a^a \vec} = (a^a + 1) \vec$
$1$表示單位矩陣
設$s=\$,那麼$\vec= \prod_^n (1+a^)\vec$
設$b_i=1+a^$,那麼題中所求即為$\sum_^r \sum_^r \prod_^j b_k$
用線段樹維護即可
常數特別難卡
#pragma gcc optimize(2)#include斐波#include
#include
using
namespace
std;
intn,q;
const
long
long mod=998244353
;struct
matrix
matrix
operator + (matrix z)const
matrix
operator * (const matrix &z)const
; }
matrix
operator ^ (int z)const
return
ret;
}}m[100005
],i,o,a;
struct
tree
; }
}tree[
400005
];inline
intread()
void update(int i,int l,int r,int
pos)
int mid=l+r>>1
;
if(pos<=mid) update(i<<1
,l,mid,pos);
else update(i<<1|1,mid+1
,r,pos);
tree[i]=tree[i<<1]+tree[i<<1|1];}
tree query(
int i,int l,int r,int ll,int
rr)int
main()
else
}return0;
}
noip模擬賽 斐波那契
分析 暴力分有90,真良心啊.a,b這麼大,連圖都建不出來,肯定是有乙個規律.把每個點的父節點寫出來 0 1 1 12 123 12345 12345678,可以發現每乙個迴圈的長度剛好是斐波那契數列中的第i項,那麼求個字首和,二分求一下lca就可以了.include include include...
NOIP模擬題 斐波那契數列
題目大意 給定長度為 n 序列 a 將它劃分成盡可能少的若干部分,使得任意部分內兩兩之和均不為斐波那契數列中的某一項。題解不難發現 2 times 10 9 之內的斐波那契數不超過 50 個 先求出第 i 個數之前最後乙個能和第 i 個數相加為斐波那契數的位置 last i 考慮每一部分 l,r 只...
HDU 5914 模擬,斐波拉契數列
hdu 5914 題目大意就是 給你乙個n,有1到n長度的木棍 問要使這些木棍組不成三角形 最少需要去掉幾根木棍 那樣例來舉例 n 41 2 3 4 我們需要去掉4這一根木棍 n 51 2 3 4 5 我們還是需要去掉4這一根木棍 n 61 2 3 4 5 6 我們需要去掉4 6 這兩根木棍 因為資...