简单的数据结构题(多项式、拉格朗日插值、线段树)

简单的数据结构题

首先考虑计算要求的式子,不妨设l=1,r=nl=1,r=nl=1,r=n

∑i=1naik∏j≠i1−aiajai−aj\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1-a_ia_j}{a_i-a_j}i=1naikj=iaiaj1aiaj

=∑i=1naik∏j≠i1ai−aj∏j≠i(1−aiaj)=\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1}{a_i-a_j}\prod_{j\not=i}(1-a_ia_j)=i=1naikj=iaiaj1j=i(1aiaj)

=∑i=1naik∏j≠i1ai−aj∑l=0n−1[xn−1−l]∏j≠i(x−aiaj)=\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1}{a_i-a_j}\sum_{l=0}^{n-1}[x^{n-1-l}]\prod_{j\not=i}(x-a_ia_j)=i=1naikj=iaiaj1l=0n1[xn1l]j=i(xaiaj)

=∑i=1naik∏j≠i1ai−aj∑l=0n−1ail[xn−1−l]∏j≠i(x−aj)=\sum_{i=1}^{n}a_i^k\prod_{j\not=i}\frac{1}{a_i-a_j}\sum_{l=0}^{n-1}a_i^l[x^{n-1-l}]\prod_{j\not=i}(x-a_j)=i=1naikj=iaiaj1l=0n1ail[xn1l]j=i(xaj)

=∑l=0n−1∑i=1naik+l∏j≠i1ai−aj[xn−1−l]∏j≠i(x−aj)=\sum_{l=0}^{n-1}\sum_{i=1}^{n}a_i^{k+l}\prod_{j\not=i}\frac{1}{a_i-a_j}[x^{n-1-l}]\prod_{j\not=i}(x-a_j)=l=0n1i=1naik+lj=iaiaj1[xn1l]j=i(xaj)

=∑l=0n−1∑i=1n[xn−1−l](aik+l∏j≠i1ai−aj)x0∏j≠i(x−aj)=\sum_{l=0}^{n-1}\sum_{i=1}^{n}[x^{n-1-l}](a_i^{k+l}\prod_{j\not=i}\frac{1}{a_i-a_j})x^0\prod_{j\not=i}(x-a_j)=l=0n1i=1n[xn1l](aik+lj=iaiaj1)x0j=i(xaj)

=∑l=0n−1∑i=1n[xn−1−l]aik+l∏j≠ix−ajai−aj=\sum_{l=0}^{n-1}\sum_{i=1}^{n}[x^{n-1-l}]a_i^{k+l}\prod_{j\not=i}\frac{x-a_j}{a_i-a_j}=l=0n1i=1n[xn1l]aik+lj=iaiajxaj

=∑l=0n−1[xn−1−l]∑i=1naik+l∏j≠ix−ajai−aj=\sum_{l=0}^{n-1}[x^{n-1-l}]\sum_{i=1}^{n}a_i^{k+l}\prod_{j\not=i}\frac{x-a_j}{a_i-a_j}=l=0n1[xn1l]i=1naik+lj=iaiajxaj


根据拉格朗日插值:

f(x)f(x)f(x)是一个过点(x1,y1),(x2,y2),...,(xn,yn)的函数(x_1,y_1),(x_2,y_2),...,(x_n,y_n)的函数(x1,y1),(x2,y2),...,(xn,yn)

M=∏i=1n(x−xi)M=\prod_{i=1}^{n}(x-x_i)M=i=1n(xxi),则

f(x)≡∑i=1nyi∏j≠ix−xjxi−xj(modM)f(x)\equiv \sum_{i=1}^{n}y_i\prod_{j\not=i}\frac{x-x_j}{x_i-x_j}(mod\space M)f(x)i=1nyij=ixixjxxj(mod M)


函数f(x)=xk+lf(x)=x^{k+l}f(x)=xk+l过点(a1,a1k+l),(a2,a2k+l),...,(an,ank+l)(a_1,a_1^{k+l}),(a_2,a_2^{k+l}),...,(a_n,a_n^{k+l})(a1,a1k+l),(a2,a2k+l),...,(an,ank+l)

∴xk+l≡∑i=1naik+l∏j≠ix−ajai−aj(mod(x−a1)(x−a2)...(x−an))\therefore x^{k+l}\equiv\sum_{i=1}^{n}a_i^{k+l}\prod_{j\not=i}\frac{x-a_j}{a_i-a_j}(mod\space(x-a_1)(x-a_2)...(x-a_n))xk+li=1naik+lj=iaiajxaj(mod (xa1)(xa2)...(xan))

∴原式=∑l=0n−1[xn−1−l](xk+lmod(x−a1)(x−a2)...(x−an))\therefore原式=\sum_{l=0}^{n-1}[x^{n-1-l}](x^{k+l}\mod(x-a_1)(x-a_2)...(x-a_n))=l=0n1[xn1l](xk+lmod(xa1)(xa2)...(xan))


注意到0≤k≤20\leq k\leq20k2,且l≤n−1l\leq n-1ln1,所以k+l≥nk+l\geq nk+ln的情况不多,分类讨论即可:

1.若k+l≤n−1k+l\leq n-1k+ln1xk+lx^{k+l}xk+l的次数低于modmodmod的多项式):

原式=∑l=1n−1[xn−1−l]xk+l=∑l=1n−1[n−1−l=k+l]原式=\sum_{l=1}^{n-1}[x^{n-1-l}]x^{k+l}=\sum_{l=1}^{n-1}[n-1-l=k+l]=l=1n1[xn1l]xk+l=l=1n1[n1l=k+l]

解得l=n−k−12l=\frac{n-k-1}{2}l=2nk1

则当n−k−1≡0(mod2)n-k-1\equiv 0(mod\space 2)nk10(mod 2)0≤n−k−10\leq n-k-10nk1时原式为1,否则为0,
即当n−k−1≡1(mod2)n-k-1\equiv1(mod\space 2)nk11(mod 2)n=1,k=2n=1,k=2n=1,k=2时原式为0,否则为1

2.若k+l≥nk+l\geq nk+ln

∵l≤n−1\because l\leq n-1ln1 ∴k≥1\therefore k\geq1k1

2.1若k=1k=1k=1

此时有l=n−1l=n-1l=n1

原式=[x0](xnmod(x−a1)(x−a2)...(x−an))原式=[x^0](x^n\mod(x-a_1)(x-a_2)...(x-a_n))=[x0](xnmod(xa1)(xa2)...(xan))
=[x0](xn−(x−a1)(x−a2)...(x−an))=[x^0](x^n-(x-a_1)(x-a_2)...(x-a_n))=[x0](xn(xa1)(xa2)...(xan))
=(−1)n+1a1a2...an=(-1)^{n+1}a_1a_2...a_n=(1)n+1a1a2...an

2.2若k=2k=2k=2

此时有l=n−2或l=n−1l=n-2或l=n-1l=n2l=n1

2.2.1若 l=n−2l=n-2l=n2

∵l≥0\because l\geq0l0 ∴n≠1\therefore n\not=1n=1

原式=[x1](xnmod(x−a1)(x−a2)...(x−an))原式=[x^1](x^n\mod(x-a_1)(x-a_2)...(x-a_n))=[x1](xnmod(xa1)(xa2)...(xan))
=[x1](xn−(x−a1)(x−a2)...(x−an))=[x^1](x^n-(x-a_1)(x-a_2)...(x-a_n))=[x1](xn(xa1)(xa2)...(xan))
=(−1)n∑i=1n∏j≠iaj=(-1)^n\sum_{i=1}^{n}\prod_{j\not=i}a_j=(1)ni=1nj=iaj

2.2.2若 l=n−1l=n-1l=n1

原式=[x0](xn+1mod(x−a1)(x−a2)...(x−an))原式=[x^0](x^{n+1}\mod(x-a_1)(x-a_2)...(x-a_n))=[x0](xn+1mod(xa1)(xa2)...(xan))
=[x0](xn+1−(x+a1+a2+...+an)⏟大除法得出(x−a1)(x−a2)...(x−an))=[x^0](x^{n+1}-\begin{matrix}\underbrace{(x+a_1+a_2+...+a_n)}\\大除法得出\end{matrix}(x-a_1)(x-a_2)...(x-a_n))=[x0](xn+1(x+a1+a2+...+an)(xa1)(xa2)...(xan))
=(−1)n+1∑i=1nai∏j=1naj=(-1)^{n+1}\sum_{i=1}^{n}a_i\prod_{j=1}^{n}a_j=(1)n+1i=1naij=1naj

n=1,k=2n=1,k=2n=1,k=2时,两处的特判可以相互抵消,于是可以不需要特判。

于是只要维护∑i=1nai\sum_{i=1}^{n}a_ii=1nai∏i=1nai\prod_{i=1}^{n}a_ii=1nai∑i=1n∏j≠iaj\sum_{i=1}^{n}\prod_{j\not=i}a_ji=1nj=iaj,在区间乘的操作下用线段树解决

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=998244353;
const int N=300010;
int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct Node{int sum,pro,ans;Node(){sum=0;pro=1;ans=0;}Node(int a,int b,int c){sum=a,pro=b,ans=c;}
}t[N<<2];
int n,m,a[N],laz[N<<2];
int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
int mul(int a,int b){return 1ll*a*b%mod;}
int power(int a,int b){int res=1;while(b){if(b&1) res=mul(res,a);a=mul(a,a);b>>=1;}return res;
}
Node merge(Node a,Node b){Node c;c.sum=add(a.sum,b.sum);c.pro=mul(a.pro,b.pro);c.ans=add(mul(a.ans,b.pro),mul(a.pro,b.ans));return c;
}
void pushup(int u){t[u]=merge(t[u<<1],t[u<<1|1]);
}
void build(int u,int l,int r){laz[u]=1;if(l==r){t[u]=Node(a[l],a[l],1);return;}int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}
void modify(int u,int l,int r,int x){t[u].sum=mul(t[u].sum,x);t[u].pro=mul(t[u].pro,power(x,r-l+1));t[u].ans=mul(t[u].ans,power(x,r-l));laz[u]=mul(laz[u],x);
}
void pushdown(int u,int l,int r){if(laz[u]!=1){int mid=(l+r)>>1;modify(u<<1,l,mid,laz[u]);modify(u<<1|1,mid+1,r,laz[u]);laz[u]=1;}
}
void update(int u,int l,int r,int a,int b,int x){if(a<=l&&r<=b){modify(u,l,r,x);return;}pushdown(u,l,r);int mid=(l+r)>>1;if(a<=mid) update(u<<1,l,mid,a,b,x);if(b>mid) update(u<<1|1,mid+1,r,a,b,x);pushup(u);
}
Node query(int u,int l,int r,int a,int b){if(a<=l&&r<=b) return t[u];pushdown(u,l,r);int mid=(l+r)>>1;Node res=Node(0,1,0);if(a<=mid) res=merge(res,query(u<<1,l,mid,a,b));if(b>mid) res=merge(res,query(u<<1|1,mid+1,r,a,b));return res; 
}
int main(){n=read();m=read();for(int i=1;i<=n;i++) a[i]=read();build(1,1,n);int opt,l,r,k;while(m--){opt=read();l=read();r=read();k=read();if(opt==1)update(1,1,n,l,r,k);else{int d=r-l+1,ans=0;if(!((d-k-1)&1)) ans++;Node now=query(1,1,n,l,r);if(k==1){if(d&1) ans=add(ans,now.pro);else ans=dec(ans,now.pro);}if(k==2){if(!(d&1)) ans=add(ans,now.ans);else ans=dec(ans,now.ans);if(d&1) ans=add(ans,mul(now.sum,now.pro));else ans=dec(ans,mul(now.sum,now.pro));}printf("%d\n",ans);}}return 0;
}

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

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

相关文章

牛客网 【每日一题】5月21日题目 图的遍历

链接&#xff1a; 文章目录题目描述题解代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小sun最近为了应付考试&#xff0c;正在复习图论&#xff0c;他现在学…

P4306-[JSOI2010]连通数【bitset】

正题 题目链接:https://www.luogu.com.cn/problem/P4306 题目大意 nnn个点的有向图&#xff0c;求图上可以相互到达点数。 解题思路 就是bitsetbitsetbitset这个黑科技的模板&#xff0c;首先是传递闭包 fi,jfi,k∣fk,jf_{i,j}f_{i,k}|f_{k,j}fi,j​fi,k​∣fk,j​也就是如果…

【贪心】国王游戏(ybtoj 贪心-1-4)

国王游戏 ybtoj 贪心-1-4 题目大意 有一个国王和n个大臣 每人左右手分别有一个数&#xff0c;现在然你对大臣们排列&#xff08;国王在第一个&#xff09; 每个大臣所得金币是前面的人左手上的数的积除以他右手上的数 现在问你获得金币最多的大臣最少得多少金币 样例输入 …

《通过C#学Proto.Actor模型》之 HelloWorld

在微服务中&#xff0c;数据最终一致性的一个解决方案是通过有状态的Actor模型来达到&#xff0c;那什么是Actor模型呢&#xff1f;Actor是并行的计算模型&#xff0c;包含状态&#xff0c;行为&#xff0c;并且包含一个邮箱&#xff0c;来异步处理消息。关于Actor的介绍可参考…

牛客网【每日一题】5月22日 [CQOI2009]中位数图

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有…

[XSY] 计数(DP,NTT,分治)

计数 考虑转化题目&#xff0c;变为网格上有若干个点&#xff0c;要从(0,0)(0,0)(0,0)走到(n,an1)(n,a_{n1})(n,an1​) &#xff0c;每一步只能往右走一步或往上走一步&#xff0c;且若当前在(i,j)(i,j)(i,j) &#xff0c;必须满足0≤j≤ai10\leq j\leq a_{i1}0≤j≤ai1​&…

P3700-[CQOI2017]小Q的表格【分块,欧拉函数】

正题 题目链接:https://www.luogu.com.cn/problem/P3700 题目大意 一个n∗nn*nn∗n个数的数字表格&#xff0c;开始位置(a,b)(a,b)(a,b)上的是a∗ba*ba∗b。数字表格需满足以下条件 对于任意(a,b)(a,b)(a,b)有f(a,b)f(b,a)f(a,b)f(b,a)f(a,b)f(b,a)对于任意(a,b)(a,b)(a,b)有…

.Net Core应用框架Util介绍(一)

距离上次发文&#xff0c;已经过去了三年半&#xff0c;这几年技术更新节奏异常迅猛&#xff0c;.Net进入了跨平台时代&#xff0c;前端也被革命性的颠覆。回顾2015年&#xff0c;正当我还沉迷于JQuery EasyUi的封装时&#xff0c;突然意识到技术已经过时。JQuery在面对更加复…

牛客网 【每日一题】5月26日题目精讲 [JSOI2007]建筑抢修

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏&#xff1a;经过了一场激烈的战斗&#xff0c;T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤&#xf…

【二分】数列分段(ybtoj 二分-1-1)

数列分段 ybtoj 二分-1-1 题目大意 给出一个序列A&#xff0c;让你把它分成m段&#xff0c;使每段和最大值最小 输入样例 5 3 4 2 4 5 1输出样例 6数据范围 1⩽M⩽N⩽1051\leqslant M\leqslant N\leqslant 10^51⩽M⩽N⩽105 sum{Ai}⩽109sum\begin{Bmatrix}A_i\end{Bmatr…

CF878E-Numbers on the blackboard【并查集,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF878E 题目大意 nnn个数字&#xff0c;每次可以把两个相邻的数字x,yx,yx,y变为x2yx2yx2y。 mmm次询问一个区间合成一个数字后最大是多少。 解题思路 答案可以把每个数字变成xicix_i^{c_i}xici​​&#xff0c;其中ci≤ci−1…

2021-03-24

非空G个数G的大小n的奇偶性答案>4\\D3\奇数D3至少一个大小>2\D3均为1偶数D-12大小均>2\D2至少一个大小>2奇数D2一个大小1&#xff0c;一个大小>1偶数D-12均为1奇数D-12均为1偶数

牛客网【每日一题】5月27日题目精讲 货币系统

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 在网友的国度中共有n种不同面额的货币&#xff0c;第i种货币的面额为a[i]&#xff0c;你可以假设每一种货币都有无穷多张。为了方便&#xff0c;我们把货币种数为n、面额数组为a[1…n]的货币系统记…

使用.NET Core+Docker 开发微服务

.NET Core发布很久了,因为近几年主要使用java&#xff0c;所以还没使用过.NET Core&#xff0c;今天正好有一个c#写的demo&#xff0c;需要做成服务&#xff0c;不想再转成java来实现&#xff0c;考虑使用.NET CORE来尝下鲜&#xff0c;目标是开发一个微服务&#xff0c;然后部…

【二分】防具布置/秦腾与教学评估(ybtoj 二分-1-2/jzoj 1253/luogu 4403)

正题 ybtoj 二分-1-2 jzoj 1253 luogu 4403 题目大意 给出n组数&#xff1a;si,ei,dis_i,e_i,d_isi​,ei​,di​ 对于每组数据&#xff0c;表示在sis_isi​加1&#xff0c;然后每隔did_idi​就加1&#xff0c;当位置大于eie_iei​时结束 题目保证数字是奇数的位置最多只有1个…

[XSY] 智慧树(线性同余方程组,线段树/树状数组)

智慧树 解决此题有两个要点&#xff1a; 如何判断一个线性同余方程组有没有解如何统计合法子序列数目 先看第2点&#xff1a; 若一个序列是合法的&#xff0c;则这个序列的所有子序列都是合法的 考虑对∀1≤i≤n\forall 1\leq i\leq n∀1≤i≤n&#xff0c;求出以iii为左端点…

P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】

正题 题目链接:https://www.luogu.com.cn/problem/P2272 题目大意 半连通图定义为任意两个点(u,v)(u,v)(u,v)满足uuu可以到vvv或vvv可以到uuu的有向图。 现在给出一张图&#xff0c;求最大半连通子图与其数量。 解题思路 显然一个强连通一定是一个半连通&#xff0c;所以我…

牛客网 【每日一题】5月28日题目精讲 Protecting the Flowers

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 Farmer John went to cut some wood and…

【二分】最大均值(ybtoj 二分-1-3)

最大均值 ybtoj 二分-1-3 题目大意 给出一个序列&#xff0c;让你求一个长度不小于m的子序列&#xff0c;使其平均值最大 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽L⩽N⩽1051\leqslant L \leqslant N \leqslant 10^51⩽L⩽N⩽105 Ai⩽2000A_i\leqs…

Steeltoe之Config客户端篇

Steeltoe是一款开源项目&#xff0c;其目标是选取源自Netflix及其它公司的工具&#xff0c;使它们能够运用于.NET社区。它不仅可以在.NET Core上&#xff0c;也可以在.NET Framework 4.X以上使用。此外&#xff0c;大多数的组件能够同时运行在本地机器及Cloud Foundry(一个领先…