YbtOJ#732-斐波那契【特征方程,LCT】

正题

题目链接:http://www.ybtoj.com.cn/contest/125/problem/2


题目大意

给出nnn个点的一棵树,以111为根,每个点有点权aia_iai。要求支持mmm次操作

  1. 修改一个修改一个节点的父节点
  2. 修改一条路径的权值为www
  3. 给出uuu询问Fbi(au)Fbi(a_u)Fbi(au)
  4. 给出u,vu,vu,v,将路径u−>vu->vu>v的点权排列好后设为bbb
    ∑i=1k∑j=ikFbi(∑z=ijbz)\sum_{i=1}^k\sum_{j=i}^kFbi(\sum_{z=i}^jb_z)i=1kj=ikFbi(z=ijbz)

其中Fbi(i)Fbi(i)Fbi(i)表示第iii个斐波那契数。输出答案模998244353998244353998244353的值

1≤n,m≤105,ai,w∈[1,109]1\leq n,m\leq 10^5,a_i,w\in[1,10^9]1n,m105,ai,w[1,109]


解题思路

嗯这个斐波那契很麻烦,可以考虑一些用特征方程1−x−x2=01-x-x^2=01xx2=0,可以得到斐波那契的通项公式
Fbi(n)=(5+12)n−(5−12)n5Fbi(n)=\frac{(\frac{\sqrt 5+1}{2})^n-(\frac{\sqrt 5-1}{2})^n}{\sqrt 5}Fbi(n)=5(25+1)n(251)n
为了方便上面5±12\frac{\sqrt 5\pm 1}{2}25±1分别记为X0,X1X_0,X_1X0,X1
那么如果设ci=X0ai,di=X1aic_i=X_0^{a_i},d_i=X_1^{a_i}ci=X0ai,di=X1ai的话我们要求的就是
∑i=1k∑j=ik∏z=ijcz−∑i=1k∑j=ik∏z=ijdz5\frac{\sum_{i=1}^k\sum_{j=i}^k\prod_{z=i}^jc_z-\sum_{i=1}^k\sum_{j=i}^k\prod_{z=i}^jd_z}{\sqrt 5}5i=1kj=ikz=ijczi=1kj=ikz=ijdz
这个好像看起来好维护一点,不过首先我们要解决这个5\sqrt 55的问题,因为其实5\sqrt 55在模998244353998244353998244353意义下是没有值的,我们不能直接用二次剩余带入数字。

考虑维护一个类似于多项式的东西,每个数字记为二元组(a,b)=a5+b(a,b)=a\sqrt 5+b(a,b)=a5+b。加减乘都很好搞,除法的话需要推导一下,
1a5+b=c5+d\frac{1}{a\sqrt 5+b}=c\sqrt 5+da5+b1=c5+d
5ac+5(ad+cb)+bd=15ac+\sqrt 5(ad+cb)+bd=15ac+5(ad+cb)+bd=1
5ac+bd=1,ad+cb=05ac+bd=1,ad+cb=05ac+bd=1,ad+cb=0
解出来c=−ab2−5a2,d=bb2−5a2c=-\frac{a}{b^2-5a^2},d=\frac{b}{b^2-5a^2}c=b25a2a,d=b25a2b
这样四则运算都搞定了,可以开始考虑如何在LCTLCTLCT上面维护了。

类似线段树的,设propropro表示所有数乘积,pre/sufpre/sufpre/suf表示所有前/后缀乘积和,ansansans表示我们维护的答案,那么就可以合并两个东西了。LCTLCTLCT维护的时候顺便把单个的节点也合并进去就好了。

然后还剩下一个最麻烦的东西就是树链修改的时候我们需要快速算出连续xxxuuu的信息。
propropro很好搞就是uxu^xuxsufsufsufpreprepre就是一个简单的等比数列求和,上通项公式就好了。
ansansans比较麻烦,考虑每个uiu^iui的个数答案就是
∑i=1xui(x−i+1)=(x+1)∑i=1xui−∑i=1xuii\sum_{i=1}^xu^i(x-i+1)=(x+1)\sum_{i=1}^xu^i-\sum_{i=1}^xu^iii=1xui(xi+1)=(x+1)i=1xuii=1xuii
⇒(x+1)ux+1−uu−1−xux+1−ux−uu−1u−1\Rightarrow (x+1)\frac{u^{x+1}-u}{u-1}-\frac{xu^{x+1}-\frac{u^x-u}{u-1}}{u-1}(x+1)u1ux+1uu1xux+1u1uxu
这样就可以在logloglog时间复杂度以内合并了。

然后答案000次项一定是000的,所以输出5\sqrt 55的项就好了。
时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll P=998244353,N=1e5+10;
struct node{ll a,b;//a带√5 node(ll aa=0,ll bb=0){a=aa;b=bb;return;}
};
ll power(ll x,ll b=P-2){ll ans=1;x%=P;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
const node X((P+1)/2,(P+1)/2);
node operator+(node x,node y)
{return node((x.a+y.a)%P,(x.b+y.b)%P);}
node operator-(node x,node y)
{return node((x.a-y.a)%P,(x.b-y.b)%P);}
node operator*(node x,node y)
{return node((x.a*y.b+x.b*y.a)%P,(x.b*y.b+5*x.a*y.a)%P);}
node inv(node x){ll tmp=power(x.b*x.b-5*x.a*x.a);return node(-x.a,x.b)*node(0,tmp);
}
node power(node x,ll b){node ans(0,1);while(b){if(b&1)ans=ans*x;x=x*x;b>>=1;}return ans;
}
struct Tnode{node ans,pre,suf,pro;
};
Tnode operator+(Tnode x,Tnode y){Tnode w;w.ans=x.ans+y.ans+x.suf*y.pre;w.pre=x.pre+y.pre*x.pro;w.suf=y.suf+x.suf*y.pro;w.pro=x.pro*y.pro;return w;
}
struct SegTree{ll fa[N],t[N][2],siz[N];Tnode w[N];node v[N],lazy[N];bool r[N],hlz[N];stack<ll> s;bool Nroot(ll x){return fa[x]&&(t[fa[x]][0]==x||t[fa[x]][1]==x);}bool Direct(ll x){return t[fa[x]][1]==x;}void Rev(ll x){swap(t[x][0],t[x][1]);swap(w[x].pre,w[x].suf);r[x]^=1;return;}void PushUp(ll x){siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;w[x]=(Tnode){v[x],v[x],v[x],v[x]};if(t[x][0])w[x]=w[t[x][0]]+w[x];if(t[x][1])w[x]=w[x]+w[t[x][1]];return;}void Updata(ll x,node u){ll s=siz[x];lazy[x]=v[x]=u;node tmp=inv(node(0,1)-u);hlz[x]=1; w[x].pro=power(u,s);w[x].pre=w[x].suf=(u-w[x].pro*u)*tmp;w[x].ans=(node(0,s)-w[x].pre)*u*tmp;return;}void PushDown(ll x){if(hlz[x]){if(t[x][0])Updata(t[x][0],lazy[x]);if(t[x][1])Updata(t[x][1],lazy[x]);hlz[x]=0;}if(!r[x])return;Rev(t[x][0]);Rev(t[x][1]);r[x]=0;return;}void Rotate(ll x){ll y=fa[x],z=fa[y];ll xs=Direct(x),ys=Direct(y);ll w=t[x][xs^1];if(Nroot(y))t[z][ys]=x;t[x][xs^1]=y;t[y][xs]=w;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return;}void Splay(ll x){ll y=x;s.push(x);while(Nroot(y))y=fa[y],s.push(y);while(!s.empty())PushDown(s.top()),s.pop();while(Nroot(x)){ll y=fa[x];if(!Nroot(y))Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}void Access(ll x){for(ll y=0;x;y=x,x=fa[x])Splay(x),t[x][1]=y,PushUp(x);return;}void MakeRoot(ll x){Access(x);Splay(x);Rev(x);return;}void Link(ll x,ll y){MakeRoot(1);Access(x);Splay(x);fa[t[x][0]]=0;t[x][0]=0;PushUp(x);fa[x]=y;return;}ll Split(ll x,ll y){MakeRoot(x);Access(y);Splay(y);return (w[y].ans.a+P)%P*2%P;}void Change(ll x,ll y,node val){MakeRoot(x);Access(y);Splay(y);Updata(y,val);return;}
}T;
ll n,m;
signed main()
{
//	freopen("fibonacci.in","r",stdin);
//	freopen("fibonacci.out","w",stdout);scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);T.v[i]=power(X,x);T.PushUp(i);}for(ll i=2;i<=n;i++)scanf("%lld",&T.fa[i]);while(m--){ll op,u,v,w;scanf("%lld",&op);if(op==1){scanf("%lld%lld",&u,&v);T.Link(u,v);}else if(op==2){scanf("%lld%lld%lld",&u,&v,&w);T.Change(u,v,power(X,w));}else if(op==3){scanf("%lld",&u);printf("%lld\n",T.Split(u,u));}else if(op==4){scanf("%lld%lld",&u,&v);printf("%lld\n",T.Split(u,v));}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020牛客国庆集训派对day3 Leftbest

Leftbest 链接&#xff1a;https://ac.nowcoder.com/acm/contest/7830/A 来源&#xff1a;牛客网 题目描述 Jack is worried about being single for his whole life, so he begins to use a famous dating app. In this app, the user is shown single men/women’s photos …

【笛卡尔树】【树状数组】Beautiful Pair(P4755)

正题 P4755 题目大意 给你n个数&#xff0c;问你有多少对二元组 (i,j)(i,j)(i,j) 满足 i≤ji\leq ji≤j 且 aiaj≤maxiijaia_i\times a_j\leq max_{ii}^ja_iai​aj​≤maxiij​ai​ 解题思路 考虑对原数组构建笛卡尔树&#xff0c;树中左右子树之间的二元组所取得的max就是当…

[译]ASP.NET Core中使用MediatR实现命令和中介者模式

在本文中&#xff0c;我将解释命令模式&#xff0c;以及如何利用基于命令模式的第三方库来实现它们&#xff0c;以及如何在ASP.NET Core中使用它来解决我们的问题并使代码简洁。因此&#xff0c;我们将通过下面的主题来进行相关的讲解。什么是命令模式?命令模式的简单实例以及…

【贪心】数据备份(P6320)

正题 P6320 题目大意 有n个点&#xff0c;相邻的点不能同时选&#xff0c;问你选k个的最小代价 解题思路 考虑贪心取每个点&#xff0c;取了一个点后设置一个撤回点&#xff0c;就是把该点的选择取反&#xff0c;同时选择左右&#xff0c;这样直接用堆维护即可 code #inclu…

codeforces1451 D. Circle Game

D. Circle Game 看到博弈题&#xff0c;直接打表不过并不能发现什么规律gg 后手每次按照先手对称进行移动&#xff0c;如果先手向右则向上&#xff0c;先手向上则向右&#xff0c;然后考虑最后一步即可。 对称技巧&#xff01;&#xff01;&#xff01; #define IO ios::syn…

2020-10-03

Flowers 题目描述 Recently Jack becomes much more romantic. He would like to prepare several bunches of flowers. Each bunch of flowers must have exactly M flowers. As Jack does not want to be boring, he hopes that flowers in the same bunch are all differ…

P4770-[NOI2018]你的名字【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为nnn的字符串SSS。qqq次询问给出一个串TTT和一个区间[L,R][L,R][L,R]&#xff0c;求TTT有多少个本质不同的子串不是SL∼RS_{L\sim R}SL∼R​的子串。 1≤n≤5105,1≤Q≤105,∑∣T∣≤1061\leq n…

.NET in Browser - Blazor

什么是BlazorBlazor 是一个实验性的. NET web 框架, 使用 C# 和 HTML 在任何浏览器中不需要插件即可运行 WebAssembly 程序集。什么是WebAssemblyWebAssembly是一种新的适合于编译到Web的&#xff0c;可移植的&#xff0c;大小和加载时间高效的格式&#xff0c;是一种新的字节码…

【数论】【杜教筛】选数(P3172)

正题 P3172 题目大意 在 [L,R] 选n个数&#xff0c;问gcdk的方案数 解题思路 因为gcdk&#xff0c;那么所选的数都是k的倍数&#xff0c;那么可以让L,R整除k&#xff0c;那么有 ∑a1LR∑a2LR...∑anLR[gcd(a1,a2...an)1]\sum_{a_1L}^R\sum_{a_2L}^R...\sum_{a_nL}^R[gcd(a_1…

【模板】吉老师线段树

ACM模板 目录区间取最值区间取最值 Gorgeous Sequence 区间最值操作往往采用以下办法 线段树维护&#xff1a; 区间最大值mx\text{mx}mx区间严格次大值smx\text {smx}smx区间和sum\text{sum}sum区间最大值个数cnt\text{cnt}cnt区间最值懒标记lazy\text{lazy}lazy 实现区间…

2020牛客国庆集训派对day4 Digits Are Not Just Characters

Digits Are Not Just Characters 题意&#xff1a; 比较大小&#xff0c;如果比目标字符串大输出“”&#xff0c;相等也输出“”&#xff0c;小则输出“-”&#xff1a; 比较规则&#xff1a; 字母大于数字 两个字母比较按照ASCII码 当被解释为十进制数时&#xff0c;两个数…

CF453C-Little Pony and Summer Sun Celebration【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF453C 题目大意 nnn个点mmm条边的一张无向图&#xff0c;每个节点有一个wiw_iwi​表示该点需要经过奇数/偶数次。 求一条满足条件的长度不超过4n4n4n的路径 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 一个结论就…

在碰撞中成长 - 北京银行的DevOps实践之路

2018年10/27日&#xff0c;在上海召开的微软年度最大规模的技术盛会—微软2018技术暨生态大会上&#xff0c;北京银行渠道系统负责人&敏捷团队负责人周兵女士和大家一起分享了北京银行的DevOps 实践转型经验&#xff0c;得到了大会听众的热烈评价和共鸣&#xff0c;会后众多…

【笛卡尔树】【线段树】meetings 会议(P5044)

正题 P5044 题目大意 给出一个序列a&#xff0c;设 dist(x,y)max⁡ixyaidist(x,y)\max_{ix}^ya_idist(x,y)maxixy​ai​&#xff0c;有m个询问&#xff0c;对于每个询问&#xff0c;给出 l,r&#xff0c;让你找一个点x(l≤x≤r)(l\leq x\leq r)(l≤x≤r)&#xff0c;使得 ∑i…

codeforces438 D. The Child and Sequence

2020威海区域赛G. Caesar Cipher就用到了此思想&#xff08; 今天碰到模板题了还是再写一遍吧 D. The Child and Sequence 区间取模操作模板题 有一个公式 x%p<x2(x>p)x\%p<\frac{x}{2}(x>p)x%p<2x​(x>p) 由此对于每一个数最多模log次&#xff0c;如果我们…

2020牛客国庆集训派对day4 Emergency Evacuation

Emergency Evacuation 题意&#xff1a; 有n个人在不同的位置上&#xff0c;在最后面有一个出口exit&#xff0c;所有人都要逃离出去&#xff08;走出出口&#xff09;&#xff0c;且每个格子最多容纳一个人&#xff0c;当有人挡在前面时&#xff0c;后面的人必须停留&#x…

P3170-[CQOI2015]标识设计【插头dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3170 题目大意 给出n∗mn*mn∗m的网格上有一些障碍&#xff0c;要求用三个LLL形&#xff08;高宽随意&#xff0c;不能退化成线段/点&#xff09;覆盖格子且LLL形之间不能重叠。 求覆盖方案&#xff08;每个LLL形相同&…

【活动(广州)】MonkeyFest2018 微软最有价值专家讲座

MonkeyFest2018微软最有价值专家讲座Monkey Fest 是一个一年一度由全球Microsoft Xamarin跨平台开发者发起的全球性社区活动&#xff0c;主要是推广在云、人工智能、大数据、移动开发等技术。本次活动同时在新加坡&#xff0c;美国&#xff0c;日本&#xff0c;加拿大&#xff…

【数学】Natasha, Sasha and the Prefix Sums(CF1204E)

正题 luogu CF1204E 题目大意 给出序列a&#xff0c;由n个1和m个-1组成&#xff0c;设 f 为最大前缀和和0的最大值&#xff0c;问全排列的 f 之和 解题思路 可以问题转换到平面图上&#xff0c;把1看作往上走&#xff0c;-1看作往下走 那么问题就变成了求 (0,0) 到 (nm,n-m…

codeforces1454 F. Array Partition

这周忙死&#xff0c;一直没机会吧补一下题&#xff0c;周二晚上打的div3&#xff0c;过了A~E&#xff0c;F就看了下题目就没时间了&#xff0c;无聊的时候想应该会用到ST表&#xff0c;然后想要维护指针&#xff0c;后来写的时候发现维护不了&#xff0c;然后就歇菜了。。。 …