YbtOJ#903-染色方案【拉格朗日插值,NTT,分治】

正题

题目链接:https://www.ybtoj.com.cn/contest/115/problem/3


题目大意

两个长度为n+1n+1n+1的序列a,ba,ba,b
aia_iai表示涂了iii个格子的可以获得的价值。
bib_ibi表示恰好用iii种颜色图最多nnn个格子可以获得的总价值。

给出序列bbb,求序列aaa

n∈[1,105]n\in[1,10^5]n[1,105],所有运算在%998244353\% 998244353%998244353意义下。


解题思路

定义cic_ici表示用iii种颜色(不需要都用)时的价值和
那么有
cn=∑i=0n(ni)bic_n=\sum_{i=0}^n\binom{n}{i}b_icn=i=0n(in)bi
cn=n!∑i=0nbii!1(n−i)!c_n=n!\sum_{i=0}^n\frac{b_i}{i!}\frac{1}{(n-i)!}cn=n!i=0ni!bi(ni)!1
然后NTTNTTNTT求出来。
之后就有
ci=∑j=0naj×ijc_i=\sum_{j=0}^na_j\times i^jci=j=0naj×ij
那么cic_ici可以视为一个多项式在x=ix=ix=i处的值,然后aia_iai表示该多项式的第iii项系数。

之后要用拉格朗日插值求出这个多项式AAA(考场上不会写了个高消草)

A(x)=∑i=1nci∏j!=ix−xjxi−xjA(x)=\sum_{i=1}^nc_i\prod_{j!=i}\frac{x-x_j}{x_i-x_j}A(x)=i=1ncij!=ixixjxxj
提出常数来,令ci=ci×∏j!=i1xi−xjc_i=c_i\times \prod_{j!=i}\frac{1}{x_i-x_j}ci=ci×j!=ixixj1(预处理一个阶乘逆元可以O(1)O(1)O(1)求)
再定义多项式M(x)=∏i=1n(x−xi)M(x)=\prod_{i=1}^n(x-x_i)M(x)=i=1n(xxi)
A(x)=∑i=1nciM(x)x−xiA(x)=\sum_{i=1}^n\frac{c_iM(x)}{x-x_i}A(x)=i=1nxxiciM(x)
但是还是不可以暴力求,但是我们可以分治求。
Ml,r(x)=∏i=lr(x−xi),Al,r(x)=∑i=lrciMl,r(x)x−xiM_{l,r}(x)=\prod_{i=l}^r(x-x_i),A_{l,r}(x)=\sum_{i=l}^r\frac{c_iM_{l,r}(x)}{x-x_i}Ml,r(x)=i=lr(xxi),Al,r(x)=i=lrxxiciMl,r(x)
那么有
Ml,r=Ml,mid×Mmid+1,rM_{l,r}=M_{l,mid}\times M_{mid+1,r}Ml,r=Ml,mid×Mmid+1,r
Al,r=Al,mid×Mmid+1,r+Amid+1,r×Ml,rA_{l,r}=A_{l,mid}\times M_{mid+1,r}+A_{mid+1,r}\times M_{l,r}Al,r=Al,mid×Mmid+1,r+Amid+1,r×Ml,r

都分治下去NTTNTTNTT做就好了,注意一下动态分配空间就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10,P=998244353;
struct Poly{ll a[N],n;
}A[40],M[40],F,G;
ll n,fac[N],inv[N],c[N],r[N];
ll x[N],y[N],tmp1[N],tmp2[N];
bool v[40];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tmp=power(3,(P-1)/p);if(op==-1)tmp=power(tmp,P-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=f[i+len]*buf%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll invn=power(n,P-2);for(ll i=0;i<n;i++)f[i]=f[i]*invn%P;}return;
}
ll mul(Poly &F,Poly &G,ll *f){for(ll i=0;i<=F.n;i++)x[i]=F.a[i];for(ll i=0;i<=G.n;i++)y[i]=G.a[i];ll l=1;while(l<=F.n+G.n+2)l<<=1;for(ll i=F.n+1;i<l;i++)x[i]=0;for(ll i=G.n+1;i<l;i++)y[i]=0;for(ll i=0;i<l;i++)r[i]=(r[i>>1]>>1)|((i&1)?(l>>1):0);NTT(x,l,1);NTT(y,l,1);for(ll i=0;i<l;i++)f[i]=x[i]*y[i]%P;NTT(f,l,-1);return F.n+G.n;
}
ll find_q(){for(ll i=0;i<40;i++)if(!v[i]){v[i]=1;return i;}
}
ll solve(ll l,ll r){ll p=find_q();if(l==r){A[p].a[0]=c[l];A[p].n=0;M[p].a[1]=1;M[p].a[0]=P-l;M[p].n=1;return p;}ll mid=(l+r)>>1;ll ls=solve(l,mid),rs=solve(mid+1,r);ll len=mul(A[ls],M[rs],tmp1);mul(A[rs],M[ls],tmp2);M[p].n=mul(M[ls],M[rs],M[p].a);A[p].n=len;for(ll i=0;i<=len;i++)A[p].a[i]=(tmp1[i]+tmp2[i])%P;v[ls]=v[rs]=0;return p;
}
signed main()
{
//	freopen("color.in","r",stdin);
//	freopen("color.out","w",stdout);scanf("%lld",&n);F.n=G.n=n;fac[0]=inv[0]=fac[1]=inv[1]=1;for(ll i=2;i<=n;i++)fac[i]=fac[i-1]*i%P,inv[i]=power(fac[i],P-2);for(ll i=0;i<=n;i++){scanf("%lld",&F.a[i]);F.a[i]=F.a[i]*inv[i]%P;G.a[i]=inv[i]%P;}mul(F,G,c);for(ll i=0;i<=n;i++){c[i]=c[i]*fac[i]%P;c[i]=c[i]*inv[i]%P*inv[n-i]%P;if((n-i)&1)c[i]=P-c[i];}ll p=solve(0,n);for(ll i=0;i<=n;i++)printf("%lld ",A[p].a[i]);return 0;
}

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

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

相关文章

【并查集】封锁阳光大学(P1330)

正题 P1330 题目大意 给你一张无向图&#xff0c;问你最少选择多少个点&#xff0c;使得每一条边都有且只有一个端点被选择 解题思路 每一条边只能选一个点&#xff0c;那么考虑对这个图黑白染色 可以用扩展域并查集判二分图&#xff0c;然后两边的点选小的就好了 code #i…

【悬线法】学习总结

【悬线法】学习总结 主要用于求满足某条件的最大矩阵 定义&#xff1a; 一条竖线&#xff0c;竖线的上端点位于矩阵的上边界或是一个障碍点&#xff0c;然后对这条悬线进行左右移动&#xff0c;直到移至障碍点或者是矩阵边界&#xff0c;进行确定这条悬线所在的极大矩阵。 底…

开源硬件论坛,燃烧你的创造力

写在大会前开源融合&#xff1a;比特与原子开源硬件延伸着开源软件的理念&#xff0c;包括硬件设计文件及基于此文件的产品都使用具有开源性质的许可协议&#xff0c;自由使用分享。虽然&#xff0c;从仅开放硬件所配套软件到对硬件本身设计也进行开放的过程&#xff0c;曾经一…

牛客练习赛 55

A - 等火车 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #inclu…

CF618F-Double Knapsack【结论】

正题 题目链接:https://www.luogu.com.cn/problem/CF618F 题目大意 给出大小为nnn&#xff0c;值域为[1,n][1,n][1,n]的两个可重集合A,BA,BA,B 需要你对它们各求出可重子集使得两个子集中的数字和相等 输出方案。 1≤n≤1061\leq n\le 10^61≤n≤106 解题思路 这个值域范围…

【LCT】遥远的国度(P3979)

正题 P3979 题目大意 给你一棵树&#xff0c;让你进行一下操作&#xff1a; 把根节点修改为x把x到y路径上的点权值修改为v查询x子树中的最小权值 解题思路 可以用LCT维护该树 查询时先make_root(rt)make\_root(rt)make_root(rt)&#xff0c;然后把x旋转到rt的儿子&#xf…

单调栈讲解

以前一直有接触&#xff0c;但是一直没单独进行分析处理 单调栈&#xff1a;维护其中元素单调性的栈 也就是从栈底到栈顶都是有序的 维护&#xff1a;如果入栈的元素满足单调性&#xff0c;直接入栈&#xff1b;如果不满足&#xff0c;就让栈顶元素出栈&#xff0c;直到能让入栈…

【深圳(活动)】70多场干货分享!价值899元的2018中国开源年会门票等你认领

开源发展20年&#xff0c;.NET Core开源 4年时间&#xff0c;.NET开源实现Mono也有18年的时间&#xff0c;特别近年国内.NET Core社区的蓬勃发展&#xff0c;.NET Core中国社区作为中国开源社区的重要参与者&#xff0c;获得官方的优惠票. 活动主办方开源社&#xff0c;为.NET …

2019-2020 ICPC Asia Hong Kong Regional Contest 补题(部分)

codeforces原题链接 大佬题解 B - Binary Tree 每个人每次一定拿走奇数&#xff08;2k−12^k-12k−1&#xff09;个节点&#xff0c;如果先手必胜不难发现两人轮流拿最终一定拿奇数次&#xff08;每次奇数个节点&#xff09;说明一共有奇数个节点&#xff0c;如果先手必败说明…

YbtOJ#526-折纸游戏【二分,hash】

正题 题目链接:https://www.ybtoj.com.cn/problem/526 题目大意 一个nmn\times mnm的网格上有字母&#xff0c;你每次可以沿平行坐标轴对折网格&#xff0c;要求对折的对应位置字母相同。 询问有多少个可能对折出来的子矩阵。 1≤nm≤1061\leq n\times m\leq 10^61≤nm≤106…

【dfs】树上游戏(P2664)

正题 P2664 题目大意 定义s(i,j)为i到j路径上的颜色数量&#xff0c;sumi∑j1ns(i,j)sum_i\sum_{j1}^ns(i,j)sumi​∑j1n​s(i,j) 现在让你求sum的和 解题思路 考虑一种颜色的贡献&#xff1a; 先把该颜色的点删掉&#xff0c;这样就形成了若干小树 不难发现&#xff0c;…

广州 office365的开发者训练营交流活动简报

2018年10月13日&#xff0c;在 微软广州办公室&#xff08;广州市天河区太古汇1座28层微软广州办公室&#xff09; 成功举办了office365的开发者训练营&#xff0c;本活动在微软官网的地址&#xff1a; https://www.microsoft.com/china/events/detail_1707。这次活动得到微软O…

YbtOJ#482-爬上山顶【凸壳,链表】

正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/2 题目大意 nnn个点&#xff0c;xxx坐标递增&#xff0c;第iii个点向第jjj个点连边。 开始一个人在点sss&#xff0c;他会向他看到过的yyy坐标最大的点的方向走&#xff08;两个点之间能够看到当且仅当它们之间没…

Educational Codeforces Round 96 (Rated for Div. 2)

今天先补了上一场的Codeforces Global Round 11三道题&#xff0c;做的心神恍惚&#xff0c;然后17点报名没敢提交&#xff0c;先写了4个题剩下的改天补一补 我是真的服信号&#xff0c;卷积卷si我了 A - Number of Apartments 枚举3和5的个数&#xff0c;直接算出来7的个数即…

【kruskal重构树】【主席树】werewolf 狼人(P4899)

正题 P4899 题目大意 给你一个图&#xff0c;对于每次询问Si,Ei,Li,RiS_i,E_i,L_i,R_iSi​,Ei​,Li​,Ri​&#xff0c;回答从SiS_iSi​走到EiE_iEi​&#xff0c;是否存在路径满足前面一段只经过Li∼n−1L_i\sim n-1Li​∼n−1,后面一段只经过0∼Ri0\sim R_i0∼Ri​ 解题思路…

数据结构题

来源&#xff1a;牛客网&#xff1a; 题目描述 题目背景 把一张纸对折100次就和珠穆朗玛峰一样高了哦 ——syh 题目描述 注:本系列题不按难度排序哦 输入描述: 第一行一个n,m 接下来一行n个数表示a[i] 接下来m行&#xff0c;每行l,r,l1,r1,x&#xff0c;表示求get(l,r,x)…

YbtOJ#832-鸽子饲养【凸包,Floyd】

正题 题目链接:https://www.ybtoj.com.cn/contest/116/problem/3 题目大意 给出两个大小分别为n,mn,mn,m的点集A,BA,BA,B。 求出BBB的一个最小子集使得该子集的凸包包含了所有点集AAA中的点。 无解输出−1-1−1 2≤n≤105,3≤m≤5002\leq n\leq 10^5,3\leq m\leq 5002≤n≤…

Codeforces Global Round 11——E随机+线性基待补

A - Avoiding Zero 不难发现如果数组所有元素和为0一定不能满足条件&#xff0c;否则一定能满足。 假设所有元素和不为0尝试以下构造&#xff0c;如果正数和小于负数和的绝对值&#xff0c;那么逆序排列&#xff0c;否则顺序排列&#xff0c;这样一定满足题意。 #define IO i…

声明式RESTful客户端在asp.net core中的应用

1 声明式RESTful客户端声明式服务调用的客户端&#xff0c;常见有安卓的Retrofit、SpringCloud的Feign等&#xff0c;.net有Refit和WebApiClient&#xff0c;这些客户端都是以java或.net某个语言来声明接口&#xff0c;描述如何请求RESTful api。1.1 WebApiClientWebApiClient由…

【树链剖分】LCA(P4211)

正题 P4211 题目大意 给你一棵树&#xff0c;有m次询问&#xff0c;每次询问要回答∑ilrdep[lca(x,i)]\sum_{il}^rdep[lca(x,i)]∑ilr​dep[lca(x,i)] 解题思路 把用差分把问题分开&#xff0c;离线做 考虑树链剖分&#xff0c;对于每个点维护轻儿子的贡献&#xff0c;即轻…