前言

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


正题

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


题目大意

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

$m$次询问能够围成周长为$q_i$有多少种围法。


解题思路

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

因为$k$很小显然是要我们处理$k$次,现在分开考虑出现两次的和出现一次的方案。若出现一次的栅栏有$x$个,拿出$k$围个的方案数就是$\binom*2^k$,若出现两次的栅栏有$y$个,拿出$k$个围的方案数就是$\binom{2x}$

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

时间复杂度$O(\ k(n\log n+m)\ )$


\(code\)

#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】loj#6261. 一个人的高三楼

    去年看过t老师写这题博客:以为是道神仙题 题目大意 求一个数列的$k$次前缀和.$n\le 10^5$. 题目分析 [计数]cf223C. Partial Sums 加强版.注意到最后的式子是$f_i ...

  2. luogu3723 [AH2017/HNOI2017]礼物 【NTT】

    题目 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天, ...

  3. Luogu4491 [HAOI2018]染色 【容斥原理】【NTT】

    题目分析: 一开始以为是直接用指数型生成函数,后来发现复杂度不对,想了一下容斥的方法. 对于有$i$种颜色恰好出现$s$次的情况,利用容斥原理得到方案数为 $$\binom{m}{i}\frac{P_ ...

  4. CF528D Fuzzy Search 【NTT】

    题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...

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

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

  6. 【NTT】hdu1402 A * B Problem Plus

    r·2^k+1 r k g 3 1 1 2 5 1 2 2 17 1 4 3 97 3 5 5 193 3 6 5 257 1 8 3 7681 15 9 17 12289 3 12 11 40961 ...

  7. nyoj 791——Color the fence——————【贪心】

    Color the fence 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Tom has fallen in love with Mary. Now Tom w ...

  8. POJ1037 A decorative fence 【动态规划】

    A decorative fence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6489   Accepted: 236 ...

  9. 【NTT】bzoj3992: [SDOI2015]序列统计

    板子题都差点不会了 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生 ...

随机推荐

  1. 如果被问到 HTTP 协议,你真的能讲清楚吗?

    前段时间,在和许久未见的老同学聊天时,突然被问到 http 协议到底是什么?脑海里面第一时间想起来的就是 request 请求.response 响应之类的词汇,但是这样讲他真的能知道是什么吗?我反问 ...

  2. Longhorn,企业级云原生容器分布式存储 - 定制默认设置

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生容器分布式存储 - 设计架构和概念 Longhorn 云原生容器分布式存储 - ...

  3. spring cloud 知识总结

    ### 单体应用存在的问题 - 随着业务的发展,开发变得越来越复杂.- 修改.新增某个功能,需要对整个系统进行测试.重新部署.- 一个模块出现问题,很可能导致整个系统崩溃.- 多个开发团队同时对数据进 ...

  4. WPF 中的DataTemplate 的嵌套

    <Window x:Class="WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xa ...

  5. git 使用代理出现 LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443 错误

    删除代理即可. 具体操作如下: 1. git config --global --list     查看git配置 发现其中有 http.https.XXXXXX.proxy 和 https.http ...

  6. jquery mobile cdn

    <head> <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.2/jque ...

  7. ubuntu apt-get Failed to fetch Temporary failure resolving 'security.ubuntu.com'

    发现是因为代理设置原因,导致无法上网,设置代理后问题解决. System Setting -> Network -> Network Proxy -> input IP+Port - ...

  8. NX二次开发-使用NXOPEN C++向导模板做二次开发

    版本 NX9+VS2012 1.怎么往VS软件里添加VC,C#,VB向导模板 先到NX安装目录下UGOPEN文件夹里找到这三个文件夹 拷贝到VS的安装目录下 这里有几个注意事项,VS2017,VS20 ...

  9. ElasticSearch集群的安装(windows)

    首先尽量保持你的磁盘空间足够大,比如你下载的软件的放在D盘,D盘尽量保持10G以上,还有C盘也差不多10G以上比较保险 一.下载 1)目前我下载的版本是elasticsearch-7.12.0-win ...

  10. vue-cli坑比系列

    Error loading saved preferences: ~/.vuerc may be corrupted or have syntax errors. Please fix/delete ...