自己对自己的吐槽..
注意多项式相关的题,卷积算得的东西,下标>n的项最好清零,不然容易错,多项式求逆手推错了….在求逆过程中卷积的大小都是n<<1,ln+1,每次的id的ln要带进去重新生成,NTT没处理到w[N]结果访问w[n-i*tt]时错,有地方没取模,细节处理的不好。

题解部分:
先考虑一段被两对oppsite的同色花截得的长度为i的弧和他对应的另一端弧的情况:
g[i]表示不跨出去连,这一段弧里也没有oppsite花的情况数,
f0[i]表示两端都不跨出去连,
f1[i]表示一端跨出去,
f2[i]表示两端都跨出去连,
讨论一下转移,发现是卷积形式于是用NTT优化。
考虑完一端弧后,考虑整个圆,固定第一对oppsite为1<->n+1,
若有第二对,顺时针枚举第一次出现的地方i=2~n,然后算出这样情况下的方案数(按两个oppsite有没有跨又可以分成4种情况),接着可以把每个这样的东西逆时针旋转i-1次得到其他方案,可以证明这样转能不重不漏覆盖所有方案,然后可以cdq+NTT nlog^2n了,
比较有空的话,因为转移是个三元一次方程组,可以求粗解,用多项式求逆可以做到nlogn(作大死)

code:

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;const int maxn = 210000;
const ll Mod = 998244353;
const ll g = 3;ll pw(ll x,int k)
{ll re=1ll;for(;k;k>>=1,(x*=x)%=Mod)if(k&1) (re*=x)%=Mod;return re;
}int N,ln;
ll ni,w[maxn];
int id[maxn];void DFT(ll f[],const int n,const int sig)
{for(int i=0;i<n;i++) if(i<id[i]) swap(f[i],f[id[i]]);int kk=N/n;for(int m=2;m<=n;m<<=1){int t=m>>1,tt=n/m;for(int j=0;j<n;j+=m){for(int i=0;i<t;i++){ll wn=sig==1?w[i*tt*kk]:w[(n-i*tt)*kk];ll tx=f[j+i],ty=f[j+i+t]*wn%Mod;f[j+i]=(tx+ty)%Mod;f[j+i+t]=(tx-ty+Mod)%Mod;}}}if(sig==-1) {ni=pw(n,Mod-2);for(int i=0;i<n;i++) (f[i]*=ni)%=Mod;}
}
void prepare(const int n,const int ln)
{for(int i=1;i<n;i++) id[i]=(id[i>>1]>>1)|((i&1)<<ln-1);
}
ll t1[maxn],t2[maxn];
void get_inv(ll a[],ll b[],const int n,const int ln)
{b[0]=pw(a[0],Mod-2);for(int m=2,ml=1;m<=n;m<<=1,ml++){prepare(m<<1,ml+1);for(int i=0;i<m;i++) t1[i]=a[i],t1[i+m]=0,b[i+m]=0;DFT(t1,m<<1,1); DFT(b,m<<1,1);for(int i=0;i<(m<<1);i++) t1[i]=b[i]*(2ll-t1[i]*b[i]%Mod)%Mod;DFT(t1,m<<1,-1);for(int i=0;i<m;i++) b[i]=t1[i],b[i+m]=0ll;}
}
int n;
ll A[maxn],B[maxn],C[maxn],D[maxn];
ll f0[maxn],f1[maxn],FZ[maxn],FM[maxn];
ll G[maxn],G0[maxn],G1[maxn],G2[maxn];
ll F0[maxn],F1[maxn],F2[maxn];ll sqr(const int i){return (ll)i*i%Mod;}int main()
{freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout);scanf("%d",&n);N=1,ln=0; while(N<=2*n) N<<=1,ln++;w[0]=1ll; w[1]=pw(g,(Mod-1)/N); for(int i=2;i<=N;i++) w[i]=(w[i-1]*w[1])%Mod;G[0]=1ll,G[2]=1ll;for(int i=4;i<=n;i+=2) G[i]=(G[i-2]+G[i-4])%Mod;for(int i=0;i<=n;i++) {G0[i]=G[i]*sqr(i)%Mod;G1[i]=G[i]*sqr(i+1)%Mod;G2[i]=G[i]*sqr(i+2)%Mod;}for(int i=0;i<=n;i++){if(i+1<=n) A[i+1]=G0[i],B[i+1]=G1[i];if(i+3<=n) C[i+3]=G1[i],D[i+3]=G2[i];}for(int i=0;i<N;i++) f0[i]=A[i],f1[i]=D[i];f0[0]=f1[0]=Mod-1;prepare(N,ln); DFT(f0,N,1); DFT(f1,N,1);for(int i=0;i<N;i++) FM[i]=f0[i]*f1[i]%Mod;DFT(FM,N,-1);for(int i=0;i<N;i++) f0[i]=B[i],f1[i]=C[i];DFT(f0,N,1); DFT(f1,N,1);for(int i=0;i<N;i++) f0[i]=f0[i]*f1[i]%Mod;DFT(f0,N,-1);for(int i=0;i<=n;i++) FM[i]=(FM[i]-f0[i]+Mod)%Mod;for(int i=n+1;i<N;i++) FM[i]=0;for(int i=0;i<N;i++) f0[i]=0;get_inv(FM,f0,N>>1,ln-1); for(int i=0;i<N;i++) FM[i]=(f0[i]+Mod)%Mod;prepare(N,ln); DFT(FM,N,1);for(int i=0;i<N;i++) f0[i]=C[i],f1[i]=G1[i];DFT(f0,N,1); DFT(f1,N,1);for(int i=0;i<N;i++) FZ[i]=f0[i]*f1[i]%Mod;DFT(FZ,N,-1); for(int i=n+1;i<N;i++) FZ[i]=0;for(int i=0;i<N;i++) f0[i]=G0[i],f1[i]=D[i]; f1[0]=Mod-1;DFT(f0,N,1); DFT(f1,N,1);for(int i=0;i<N;i++) f0[i]=f0[i]*f1[i]%Mod;DFT(f0,N,-1); for(int i=n+1;i<N;i++) f0[i]=0;for(int i=0;i<N;i++) FZ[i]=(FZ[i]-f0[i]+Mod)%Mod;DFT(FZ,N,1);for(int i=0;i<N;i++) F0[i]=FZ[i]*FM[i]%Mod;DFT(F0,N,-1); for(int i=n+1;i<N;i++) F0[i]=0;for(int i=0;i<N;i++) FZ[i]=G1[i];DFT(FZ,N,1);for(int i=0;i<N;i++) F1[i]=FZ[i]*FM[i]%Mod;DFT(F1,N,-1); for(int i=n+1;i<N;i++) F1[i]=0;for(int i=0;i<N;i++) FM[i]=(Mod-D[i])%Mod; FM[0]++;for(int i=0;i<N;i++) f0[i]=0;get_inv(FM,f0,N>>1,ln-1); for(int i=0;i<N;i++) FM[i]=(f0[i]+Mod)%Mod;prepare(N,ln); DFT(FM,N,1);for(int i=0;i<N;i++) f0[i]=B[i],f1[i]=F1[i];DFT(f0,N,1); DFT(f1,N,1);for(int i=0;i<N;i++) f0[i]=f0[i]*f1[i]%Mod;DFT(f0,N,-1); for(int i=n+1;i<N;i++) f0[i]=0;for(int i=0;i<N;i++) FZ[i]=(G2[i]+f0[i])%Mod;DFT(FZ,N,1);for(int i=0;i<N;i++) F2[i]=FZ[i]*FM[i]%Mod;DFT(F2,N,-1); for(int i=n+1;i<N;i++) F2[i]=0;ll ans=(G[n-1]+G[n-3])%Mod*sqr(n-1)%Mod*(ll)n%Mod;for(int i=1;i<n-2;i++){ans+=G0[i]*F0[n-i-2]%Mod*(ll)(i+1)%Mod;ans+=G1[i-1]*F1[n-i-3]%Mod*(ll)(i+1)%Mod*2ll%Mod;if(i>=2&&n-i-4>=0) ans+=G2[i-2]*F2[n-i-4]%Mod*(ll)(i+1)%Mod;}printf("%lld\n",ans%Mod);return 0;
}

codeforces 848E. Days of Floral Colours相关推荐

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

    正题 题目链接:https://www.luogu.com.cn/problem/CF848E 题目大意 2n2n2n个花排成一个圆环,nnn种颜色每种两个,要求两个相同颜色之间最小距离为1,21,2 ...

  2. GOOD BYE OI

    大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...

  3. CodeForces刷题:Theatre Square、Watermelon、Chat Server‘s Outgoing Traffic、Triangle、Die Roll

    记录Codeforces刷题QAQ 一.Theatre Square 题面翻译 用 $ a \times a$ 的石板覆盖 $n \times m $ 的长方形广场,允许石板覆盖的区域超出广场,不允许 ...

  4. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  5. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  6. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  7. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  8. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  9. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

最新文章

  1. Win10 + QT5.14.2 + Opencv4.1.1 编译环境搭建
  2. 过滤请求绝技,布隆过滤器与布谷鸟过滤器
  3. JHipster生成微服务架构的应用栈(二)- 认证微服务示例
  4. u-boot-1.1.6 设置新分区支持设备树
  5. Java中的泛型方法
  6. 快速了解和使用Photon Server
  7. 1gitolite构建git服务器
  8. 2014/School_C_C++_A/3/x的x次幂
  9. 【Python web 开发】viewset 实现商品详情页的接口
  10. java trim 不好使_Java String trim无效
  11. Django-urls路由系统
  12. Java编写斗地主的游戏源码
  13. 手机如何在线图片识别?3大教程,一键轻松图片转文字
  14. 卅三先生的工程电磁场讲座.EEm05——边界条件001
  15. word文档怎么找回误删的文件_怎样找回误删除的word文件?
  16. HBuilderX - 高效极客技巧
  17. linux安装软件时/usr/lib/python2.7/site-packages/urlgrabber/grabber.py文件异常
  18. 3、HTTP请求头与响应头
  19. Dota2 AI 简易开发教程(二)——英雄出装及其相关功能
  20. 9月才刚过十天不到,这些IT大厂就停止秋招了

热门文章

  1. 上古卷轴3晨风详尽指引攻略
  2. 学院官网项目三级页面总结
  3. Linux安装wine以及运行Windows程序
  4. Go开发之如何破解安装GoLand编译器?
  5. ie6浏览器下border边框线出现断裂问题解决方法
  6. 如何复制VMware虚拟机
  7. 功率放大器的输入阻抗和输出阻抗的关系
  8. kotlin协程+retrofit简单取消接口回调
  9. 【Vectorizer.AI】免费将 JPEG 和 PNG 位图转换为 SVG 矢量图
  10. 14z app测试方法与技术 -软件测试