线段树维护等比数列

您所在的位置:网站首页 线段树区间加等差数列 线段树维护等比数列

线段树维护等比数列

2024-07-17 20:04| 来源: 网络整理| 查看: 265

先上一道例题:CF446C 维护区间求和 和区间对应位置加上对应的斐波那契数列。 这不是一个一次函数,也不是一个差分序列。所以我们线段树不能做区间加这一个操作。

考虑斐波那契数列的通项 $Fn=\frac{\sqrt{5}}{5}[(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n]$

发现这个东西是一个等比数列 我们可以利用线段树来维护等比数列 当然由于存在模数1e9+9

那么$\sqrt{5}$这个东西就好处理了。

简述一下二次剩余:存在一个式子$x^2\equiv n(mod p)$ 给出n和p 求出一个x满足这个等式 则我们称n为模p的二次剩余。 若不存在这样的x则称n是模p的非二次剩余。同时我们称x为二次同余方程的解。

对于一个n如果我们要求$\sqrt{n}mod p$的值 那么么我们按n是否是模p的二次剩余如果是的话就会满足$x^2\equiv n(mod p)\to \sqrt{n} mod p$

那么我们就可以用x代替$\sqrt{n}$即只需要求出该二次同余方程的解即可。

综上对于上述题目 我们找到关于5的二次同余方程的解再除以一波逆元可以发现变成了两个等比数列。

我们直接线段树维护等比数列即可。关于区间加我们等比数列求和更新该区间的值。

考虑下放标记其实我们找到对应的区间加上左端点的等比数列的比该pushdown的时候把右边区间加上左边区间的贡献即可。 ``` //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define db double #define INF 1000000000 #define ld long double #define pb push_back #define put(x) printf("%d\n",x) #define min(x,y) ((x)>(y)?(y):(x)) #define max(x,y) ((x)>(y)?(x):(y)) #define rep(p,n,i) for(ll i=p;i



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3