CF848E-Days of Floral Colours【dp,分治NTT】

正题

题目链接:https://www.luogu.com.cn/problem/CF848E


题目大意

2n2n2n个花排成一个圆环,nnn种颜色每种两个,要求两个相同颜色之间最小距离为1,21,21,2nnn

对于一种染色方案的权值为:删除掉距离为nnn的颜色后,剩下的连续段长度的乘积。

求所有方案的染色之和对998244353998244353998244353取模。

1≤n≤500001\leq n\leq 500001n50000


解题思路

环好像很麻烦,先考虑线段上的,现在有两个长度为nnn的数列,然后距离为nnn的点之间对应。染色可以看为连接两个点。

然后设gig_igi表示不使用跨越数列的连线,涂iii个的方案数,那么有gi=gi−2+gi−4g_i=g_{i-2}+g_{i-4}gi=gi2+gi4(相邻的连接/两个都是隔着对方连)。

然后考虑有跨越数列的线的方案,且没有其他连线跨过这条线,f0if0_if0i表示第iii个是满足条件的线的权值和。f1if1_if1i则表示刚好有一对距离为222的点对跨越这个线的权值和。
那么有转移方程
f0i=gii2+∑j=0i−1gjj2f0i−j−1+∑j=0i−3gj(j+1)2f1i−j−3f0_i=g_ii^2+\sum_{j=0}^{i-1}g_jj^2f0_{i-j-1}+\sum_{j=0}^{i-3}g_j(j+1)^2f1_{i-j-3}f0i=gii2+j=0i1gjj2f0ij1+j=0i3gj(j+1)2f1ij3
(第一个是全程没有其他横跨边,第二个是上一条横跨边两边没有同色,第三个是上一条横跨边两边有同色)
同理可以得到f1f1f1的方程
f1i=gi(i+1)2+∑j=0i−1gj(j+1)2f0i−j−1+∑j=0i−3gj(j+2)2f1i−j−3f1_i=g_i(i+1)^2+\sum_{j=0}^{i-1}g_j(j+1)^2f0_{i-j-1}+\sum_{j=0}^{i-3}g_j(j+2)^2f1_{i-j-3}f1i=gi(i+1)2+j=0i1gj(j+1)2f0ij1+j=0i3gj(j+2)2f1ij3

得到f0f0f0f1f1f1之后,看一下f0,f1f0,f1f0,f1都是最左边没有距离为222的边越过的,但是我们转换到环上的时候需要考虑这种情况,所以我们设f2if2_if2i表示左右两边的横跨边都有同色的,中间距离为iii的权值和。
方程是
f2i=gi(i+2)2+∑j=0i−1gj(j+1)2f0i−j−1+∑j=0j−3gj(j+2)2f1i−j−3f2_i=g_i(i+2)^2+\sum_{j=0}^{i-1}g_j(j+1)^2f0_{i-j-1}+\sum_{j=0}^{j-3}g_j(j+2)^2f1_{i-j-3}f2i=gi(i+2)2+j=0i1gj(j+1)2f0ij1+j=0j3gj(j+2)2f1ij3

然后考虑转换到行上。

如果只有一个点对距离是nnn,那么贡献是(n−1)(n-1)(n1),有nnn种旋转方法,如果这个点对两边没有同色点,那么方案数是gn−1g_{n-1}gn1,否则是gn−3g_{n-3}gn3,所以这种情况的方案是(n−1)2n(gn−1+gn−3)(n-1)^2n(g_{n-1}+g_{n-3})(n1)2n(gn1+gn3)

然后剩下的我们可以先固定1∼n+11\sim n+11n+1,然后枚举第二个距离为nnn的点对。设为iii,那贡献就是i(i−1)2(gi−1f0n−i−1+2gi−2f1n−i−2+gi−3f2n−i−3)i(i-1)^2(g_{i-1}f0_{n-i-1}+2g_{i-2}f1_{n-i-2}+g_{i-3}f2_{n-i-3})i(i1)2(gi1f0ni1+2gi2f1ni2+gi3f2ni3)

然后前面求f0,f1,f2f0,f1,f2f0,f1,f2都可以用分治NTTNTTNTT搞。

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

如果用生成函数再推推可以分别得到O(n)O(n)O(n)O(nlog⁡n)O(n\log n)O(nlogn)的方法。

还有可以用生成函数发现这是一个161616项的线性递推式,打出前面的表再用高斯消元得到系数,可以把时间优化到logloglog级别

路还很长啊


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,P=998244353;
ll n,m,r[N],g[N],h[3][N],f[3][N];
ll t[3][N],T[2][N],z[4][N];
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 Glen(ll n){m=1;while(m<=n)m<<=1;for(ll i=0;i<m;i++)r[i]=(r[i>>1]>>1)|((i&1)?(m>>1):0);return;
}
void NTT(ll *f,ll op){for(ll i=0;i<m;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=m;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<m;k+=p){ll buf=1;for(ll i=k;i<k+len;i++){ll tt=buf*f[i+len]%P;f[i+len]=(f[i]-tt+P)%P;f[i]=(f[i]+tt)%P;buf=buf*tmp%P;}}}if(op==-1){ll inv=power(m,P-2);for(ll i=0;i<m;i++)f[i]=f[i]*inv%P;}return;
}
void CDQ(ll l,ll r){if(l==r){(f[0][l]+=h[0][l])%=P;(f[1][l]+=h[1][l])%=P;return;}ll mid=(l+r)>>1;CDQ(l,mid);Glen((r-l+1)*2);for(ll i=0;i<m;i++)t[0][i]=t[1][i]=t[2][i]=T[0][i]=T[1][i]=0;for(ll i=0;i<=r-l+1;i++)t[0][i]=h[0][i],t[1][i]=h[1][i],t[2][i]=h[2][i];for(ll i=0;i<=mid-l;i++)T[0][i]=f[0][i+l],T[1][i]=f[1][i+l];NTT(t[0],1);NTT(t[1],1);NTT(t[2],1);NTT(T[0],1);NTT(T[1],1);for(ll i=0;i<m;i++){z[0][i]=t[0][i]*T[0][i]%P,z[1][i]=t[1][i]*T[1][i]%P;z[2][i]=t[1][i]*T[0][i]%P,z[3][i]=t[2][i]*T[1][i]%P;}NTT(z[0],-1);NTT(z[1],-1);NTT(z[2],-1);NTT(z[3],-1);for(ll i=0;i<=r-l+1;i++){if(l+i+1>mid&&l+i+1<=r){f[0][l+i+1]=(f[0][l+i+1]+z[0][i])%P;f[1][l+i+1]=(f[1][l+i+1]+z[2][i])%P;}if(l+i+3>mid&&l+i+3<=r){f[0][l+i+3]=(f[0][l+i+3]+z[1][i])%P;f[1][l+i+3]=(f[1][l+i+3]+z[3][i])%P;}}CDQ(mid+1,r);return;
}
void solve(ll l,ll r){if(l==r){(f[2][l]+=h[2][l])%=P;return;}ll mid=(l+r)>>1;solve(l,mid);Glen((r-l+1)*2);for(ll i=0;i<m;i++)t[1][i]=t[2][i]=T[0][i]=T[1][i]=0;for(ll i=0;i<=r-l+1;i++)t[1][i]=h[1][i],t[2][i]=h[2][i];for(ll i=0;i<=mid-l;i++)T[0][i]=f[1][l+i],T[1][i]=f[2][l+i];NTT(t[1],1);NTT(t[2],1);NTT(T[0],1);NTT(T[1],1);for(ll i=0;i<m;i++){z[0][i]=t[1][i]*T[0][i]%P;z[1][i]=t[2][i]*T[1][i]%P;}NTT(z[0],-1);NTT(z[1],-1);for(ll i=0;i<r-l+1;i++){if(l+i+1>mid&&l+i+1<=r)(f[2][l+i+1]+=z[0][i])%=P;if(l+i+3>mid&&l+i+3<=r)(f[2][l+i+3]+=z[1][i])%=P;}solve(mid+1,r);return;
}
signed main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout);scanf("%lld",&n);g[0]=g[2]=1;for(ll i=4;i<=n;i++)g[i]=(g[i-4]+g[i-2])%P;for(ll i=0;i<=n;i++){h[0][i]=g[i]*i%P*i%P;h[1][i]=g[i]*(i+1)%P*(i+1)%P;h[2][i]=g[i]*(i+2)%P*(i+2)%P;}CDQ(0,n);solve(0,n);ll ans=(g[n-1]+g[n-3])*(n-1)%P*(n-1)%P*n%P;for(ll i=2;i<n-1;i++){ll tmp=g[i-1]*f[0][n-i-1]%P;tmp=(tmp+2*g[i-2]*f[1][n-i-2]%P)%P;tmp=(tmp+g[i-3]*f[2][n-i-3]%P)%P;tmp=tmp*i%P*(i-1)%P*(i-1)%P;ans=(ans+tmp)%P;}printf("%lld\n",ans);return 0;
}

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

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

相关文章

2020 China Collegiate Programming Contest Qinhuangdao Site 补题部分

已经补AEFGK E. Exam Results 枚举二分动态开点权值线段树O(nlogN)O(nlogN)O(nlogN) 智商太低&#xff0c;想不到什么贪心只能暴力数据结构维护 对于所有学生的最高成绩只可能是ai(1≤i≤n)a_i(1\leq i\leq n)ai​(1≤i≤n)或者最大的bib_ibi​&#xff0c;对于后面一种情况…

CCPC Training Class

杭电oj 题意&#xff1a; 字符串中出现次数最多的字母的次数是多少&#xff1f; 题解&#xff1a; 题目看不懂。。。又臭又长 懒得看。。 但是仔细看样例就会发现。。其实考的很简单 比赛时这题是我做的&#xff0c;以下为考试原码 代码&#xff1a; #include<string&…

【交互】Omkar and the Meaning of Life(CF-1586D)

正题 CF-1586D 题目大意 有一个大小为n的数列a&#xff0c;你可以进行最多2*n次查询 对于每次查询&#xff0c;你要给出一个大小为n的数列b&#xff0c;ciaibic_ia_ib_ici​ai​bi​&#xff0c;题目会回答c中出现次数大于2的数的最早出现位置 现在让你得出a数组 解题思路 …

ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库

SQLite 内存数据库&#xff08;in-memory database&#xff09;的连接字符串是 Data Source:memory: &#xff0c;它的特点是数据库连接一关闭&#xff0c;数据库就会被删除。而使用 services.AddDbContext 通过连接字符串配置 EF Core 时&#xff0c;EF Core 会在每次查询或…

P4389-付公主的背包【生成函数,多项式exp】

正题 题目链接:https://www.luogu.com.cn/problem/P4389 题目大意 nnn种物品&#xff0c;第iii种大小为viv_ivi​&#xff0c;数量无限。对于每个s∈[1,m]s\in[1,m]s∈[1,m]求刚好填满sss容量的方案数。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 统计和为一定值的…

mex性质学习

E.Complicated Computations 如果一个区间的mexamexamexa&#xff0c;满足以下条件&#xff1a; 区间未出现aaa区间出现1→a−11\to a-11→a−1 因此若考虑是否存在一个区间的mex值是aaa&#xff0c;我们尝试把整个区间以aaa为端点划分成若干段&#xff0c;只要每一段内&…

Cows

题目 题意: 有一群牛&#xff0c;每个牛有两个属性值[S,E]&#xff0c;如果牛i和牛j属性值满足Si < Sj 且 Ej < Ei 且 Ei - Si > Ej - Sj&#xff0c;牛i比牛j强壮&#xff0c;输出每个牛比自己强壮的牛的数量。 题解&#xff1a; 我们可以把[S,E]看作坐标&#x…

【SAM】差异(P4248)

正题 P4248 题目大意 设TiT_iTi​为第i个字符开始的后缀&#xff0c;求&#xff1a; ∑i1n∑ji1nlen(Ti)len(Tj)−2lcp(Ti,Tj)\sum_{i1}^n \sum_{ji1}^n len(T_i)len(T_j)-2\times lcp(T_i,T_j)i1∑n​ji1∑n​len(Ti​)len(Tj​)−2lcp(Ti​,Tj​) 解题思路 用SAM建立paren…

P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问&#xff0c;给出n,kn,kn,k求 ∑i0k(ni)\sum_{i0}^{k}\binom{n}{i}i0∑k​(in​) 对233323332333取模的值 1≤T≤105,1≤k≤n≤10181\leq T\leq 10^5,1\leq k\leq n\leq 10^{18}1≤T≤105,1≤k≤n≤1…

AServer - 基于Asp.net core Kestrel的超迷你http服务器

AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里&#xff0c;用来快速的响应Http请求&#xff0c;而不需要集成整个ASP.NET Core MVC 框架。一&#xff1a;什么是ASever&#xff1f;AServer就像它的名字一样&#xff0c;Just a serv…

特征根是复数的二阶微分方程

考虑如下微分方程d2ydx2a1dydxa2x0\frac{d^2y}{dx^2}a_1\frac{dy}{dx}a_2x0dx2d2y​a1​dxdy​a2​x0 众所周知&#xff0c;一般求得二阶常系数线性微分方程的通常由以下步骤 根据微分方程写出它的特征方程λ2a1λa20\lambda^2a_1\lambdaa_20λ2a1​λa2​0求解特征方程的两个…

Buy and Resell 2018中国大学生程序设计竞赛 - 网络选拔赛

题目 题意&#xff1a; n个宝石&#xff0c;宝石的买入或卖出价格固定&#xff0c;一天只能到一个珠宝商店&#xff08;从左到右&#xff09;&#xff0c;问最大利润是多少&#xff1f;在保证最大利润的同时最少交换次数是多少&#xff1f; 题解&#xff1a; 题目有两问&am…

基于Service fabric + Ocelot + Identity Server4 + 52ABP 的案例展示

10.24-27 大会Microsoft Tech Summit 2018 在上海举办&#xff0c;我 有幸受邀成为这场大会的讲师。Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行&#xff0c;这也会是国内举办的最后一届 Tech Summit&#xff0c;2019 年开始会以 Micr…

【网络流】植物大战僵尸(P2805)

正题 P2805 题目大意 在一个nmn\times mnm的平面上有若干植物&#xff0c;每个植物有其攻击集合&#xff0c;吃掉一个植物要先吃掉该植物右边的所有植物&#xff0c;且该植物不能在任何一个植物的攻击集合内&#xff0c;吃掉后有贡献ai,ja_{i,j}ai,j​&#xff0c;问你最大贡…

YbtOJ#763-攻城略池【线段树合并】

正题 题目链接:http://www.ybtoj.com.cn/problem/763 题目大意 给出nnn个点的一棵树&#xff0c;每个di0d_i0di​0的点每秒会产生一个士兵往根节点走&#xff0c;走到一个节点让一个节点did_idi​减一&#xff08;为000就不管&#xff09;。 求需要多久才能让所有点的ddd值变…

ARC106——E - Medals

E - Medals 首先看到这题看不出是一个匹配的题大佬题解 把每一个工人和每一天看成一个二分图&#xff0c;如果某个工人在某天工作&#xff0c;那么两者存在边&#xff0c;现在问题转化成至少需要多少天&#xff0c;能够把nnn个工人全部匹配kkk次 显然天数可以二分&#xff0…

2020 CCPC网络赛 赛后感

第一次参加&#xff0c;做过去年19年网络赛的题&#xff0c;去年是四个水题稳做出&#xff0c;然后还有两个线段树和树状数组的题&#xff08;好像是&#xff09;&#xff0c;所以本来对这次网络赛挺有信心的&#xff08;去年好像四个题就能进,当然要手速快&#xff09;。 这次…

Feature Flag 功能发布控制

背景产品在新功能发布前&#xff0c;可能会采取小流量测试的方式&#xff0c;或者在确定方案前使用A/B测试来衡量。一般开发人员会跟运维同学合作&#xff0c;通过一些现有平台切换机器或者流量来实现。本文介绍了另外一种简便的方式&#xff0c;并解释了其在持续集成上的应用&…

P4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】

正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出n1n1n1个点mmm条边的无向图&#xff0c;kkk个人开始在000号点&#xff0c;一个人进入iii号点之前必须要有人经过i−1i-1i−1号点&#xff0c;求第一个人进入nnn号点时所有人的最短移动距离和。 1≤n≤150…

【线段树】GSS5 - Can you answer these queries V(luogu-SPOJ 2916)

正题 luogu-SPOJ 2916 题目大意 给你一个序列&#xff0c;有若干询问&#xff0c;每次给出左右端点的区间&#xff0c;问你最大字段和 解题思路 用线段树维护区间信息&#xff0c;询问的区间如果有交则分类讨论求解 code #include<cstdio> #include<cstring> #…