前言

刚开始看错题推了半天的生成函数


正题

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


题目大意

nnn个白色木板,kkk个红色木板,给出这些木板的高度,木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升,右边单调降。

mmm次询问能够围成周长为qiq_iqi​有多少种围法。


解题思路

首先如果栅栏多余两个可以看做是两个,因为同一个高度的栅栏最多只能出现两次,而木板相同。

因为kkk很小显然是要我们处理kkk次,现在分开考虑出现两次的和出现一次的方案。若出现一次的栅栏有xxx个,拿出kkk围个的方案数就是(xk)∗2k\binom{x}{k}*2^k(kx​)∗2k,若出现两次的栅栏有yyy个,拿出kkk个围的方案数就是(k2x)\binom{k}{2x}(2xk​)

然后两种方案卷起来就可以计算答案了。

时间复杂度O(k(nlog⁡n+m))O(\ k(n\log n+m)\ )O( k(nlogn+m) )


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=(12*1e5)+10,P=998244353;
struct poly{ll a[N],n;
}F,G;
ll n,m,t,f1,f2,r[N],a[N],v[N],b[N],f[N],pw[N],fac[N],inv[N],q[N],ans[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 NTT(ll *f,ll n,ll op){for(ll i=0;i<n;i++)if(r[i]<i)swap(f[r[i]],f[i]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;ll 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;
}
void mul(poly &a,poly &b){ll n=1;while(n<=a.n+b.n)n<<=1;for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)^((i&1)?(n>>1):0);NTT(a.a,n,1);NTT(b.a,n,1);for(ll i=0;i<n;i++)a.a[i]=a.a[i]*b.a[i]%P;NTT(a.a,n,-1);return;
}
ll C(ll n,ll m)
{return fac[n]*inv[m]%P*inv[n-m]%P;}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);fac[0]=pw[0]=inv[0]=1;for(ll i=1;i<=4*n;i++)fac[i]=fac[i-1]*i%P,pw[i]=pw[i-1]*2%P;inv[4*n]=power(fac[4*n],P-2);for(ll i=4*n;i>1;i--)inv[i-1]=inv[i]*i%P;for(ll i=1;i<=m;i++)scanf("%lld",&b[i]);sort(b+1,b+1+m);scanf("%lld",&t);for(ll i=1;i<=t;i++)scanf("%lld",&q[i]);sort(a+1,a+1+n);ll l=1;for(ll k=1;k<=m;k++){while(l<=n&&a[l]<b[k]){if(!v[a[l]])f1++;else if(v[a[l]]==1)f1--,f2++;v[a[l]]++;l++;}memset(G.a,0,sizeof(G.a));memset(F.a,0,sizeof(F.a));for(ll i=0;i<=f1;i++)G.a[i]=pw[i]*C(f1,i)%P;G.n=f1+1;for(ll i=0;i<=2*f2;i++)F.a[i]=C(2*f2,i);F.n=2*f2+1;mul(G,F);for(ll i=1;i<=t;i++)if(q[i]>=b[k]*2+2)ans[i]=(ans[i]+G.a[q[i]/2-b[k]-1])%P;}for(ll i=1;i<=t;i++)printf("%lld\n",ans[i]);return 0;
}

CF1251F-Red-White Fence【NTT】相关推荐

  1. 【推导】【NTT】hdu6061 RXD and functions(NTT)

    题意:给定一个n次多项式f(x)的各项系数,让你求f(x-Σai)的各项系数. http://blog.csdn.net/v5zsq/article/details/76780053 推导才是最关键的 ...

  2. AT2064-[AGC005F]Many Easy Problems【NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/AT2064 题目大意 给出nnn个点的一棵树,对于k∈[1,n]k\in[1,n]k∈[1,n]求出所有kkk个点的 ...

  3. 牛客挑战赛53G-同源数组(Easy Version)【NTT】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出nnn个长度为mmm的数组,然后你每次可以进行差分(不会改变数组长度那种)和前缀和 ...

  4. P6800-[模板]Chirp Z-Transform【NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P6800 题目大意 给出一个nnn此多项式PPP,对于k∈[0,m−1]k\in[0,m-1]k∈[0,m−1]所有 ...

  5. [2020.11.4NOIP模拟赛]简单的打击【NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/U138580 题目大意 两个长度为nnn的序列,要求重排后同位置的相加后众数的个数最多. 解题思路 定义aia_ia ...

  6. jzoj4051-序列统计【NTT】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3017/2 题目大意 求有多少个长度为nnn的序列使得 都是在集合SSS中的数 这些数的乘积%m=x\% ...

  7. HDU 6589 Sequence【NTT】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6589 AC代码: #include<bits/stdc++.h> using namesp ...

  8. 【NTT】Gym - 101480 - F - Frightful Formula

    题目链接https://codeforces.com/gym/101480/attachments 题意 给出一个矩阵,第一行是数组 t t t,第一列是数组 l l l,其余的值为 F [ i ] ...

  9. linux安装软件程序(Debian【aptitude】、Red Hat系统【yum】、源代码安装)————附带详细方法

    安装软件程序 文章目录 安装软件程序 0 总结 1 包管理基础 2 基于Debian 的系统 2.1 使用`aptitude` 3 基于Red Hat 的系统 3.1 使用 4 源码安装 0 总结 l ...

最新文章

  1. mysql通用分页_MySQL海量数据的通用存储过程分页代码
  2. bootstrap 评价页面_文章评论《 HTML5 与 Bootstrap 应用实例 》
  3. 投影幕布尺寸计算器_如果把投影幕布安装在家里,有哪些安装位置和方式?
  4. freemarker.template.TemplateException: Expected string. column.nullable evaluated instead to freemar
  5. 2503 常用格式验证
  6. 【Linux系统编程】可重入和不可重入函数
  7. [WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]
  8. 如何搭建一个内部组件共享平台
  9. HTML5清爽简洁外贸网站模板
  10. case when 效率高不高_扬州效率高的拍摄抖音短视频平台
  11. spring事务配置的两种方式
  12. 注解配置springMvc及向作用域中赋值
  13. 免费下载全球SRTM高程数据(hgt格式)
  14. 汽车电子ISO7637-2 5A/5B抛负载测试详解
  15. POJ 3684 Physics Experiment(弹性碰撞)
  16. 在亚马逊网上注册kindle 3及下载免费电子图书的步骤
  17. rm -rf和rm -f和rm
  18. 2023mac电脑系统第三方清理软件CleanMyMacX
  19. 逆滤波和维纳滤波(附Matlab完整代码)
  20. verification和validation的区别

热门文章

  1. python数据整理_python数据类型整理
  2. kafka 怎么样连接图形化界面_图形化编程有多简单,点亮LED不到一分钟
  3. Java将mysql输出csv_使用Java将大量数据从数据库导出到.csv时出...
  4. 后端根据百度地图真实路径距离_导航软件哪家强?实测百度地图and高德地图哪个更靠谱...
  5. deb包如何改支持12系统_对一个deb包的解压、修改、重新打包全过程方法
  6. 7-35 城市间紧急救援 (25 分)(思路加详解)
  7. [PAT乙级]1007 素数对猜想
  8. Redis持久化-深入理解AOF,RDB
  9. 口袋操作系统_全自动阀口袋包装机的发展
  10. #3456. 城市规划(生成函数,多项式求逆)