CF1251F-Red-White Fence【NTT】
前言
刚开始看错题推了半天的生成函数

正题
题目链接: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】的更多相关文章
- 【NTT】loj#6261. 一个人的高三楼
去年看过t老师写这题博客:以为是道神仙题 题目大意 求一个数列的$k$次前缀和.$n\le 10^5$. 题目分析 [计数]cf223C. Partial Sums 加强版.注意到最后的式子是$f_i ...
- luogu3723 [AH2017/HNOI2017]礼物 【NTT】
题目 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天, ...
- Luogu4491 [HAOI2018]染色 【容斥原理】【NTT】
题目分析: 一开始以为是直接用指数型生成函数,后来发现复杂度不对,想了一下容斥的方法. 对于有$i$种颜色恰好出现$s$次的情况,利用容斥原理得到方案数为 $$\binom{m}{i}\frac{P_ ...
- CF528D Fuzzy Search 【NTT】
题目链接 CF528D 题解 可以预处理出\(S\)每个位置能匹配哪些字符 对每种字符 构造两个序列 如果\(S[i]\)可以匹配该字符,则该位置为\(0\),否则为\(1\) 如果\(T[i]\)可 ...
- 【推导】【NTT】hdu6061 RXD and functions(NTT)
题意:给定一个n次多项式f(x)的各项系数,让你求f(x-Σai)的各项系数. http://blog.csdn.net/v5zsq/article/details/76780053 推导才是最关键的 ...
- 【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 ...
- nyoj 791——Color the fence——————【贪心】
Color the fence 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Tom has fallen in love with Mary. Now Tom w ...
- POJ1037 A decorative fence 【动态规划】
A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6489 Accepted: 236 ...
- 【NTT】bzoj3992: [SDOI2015]序列统计
板子题都差点不会了 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数 列,数列中的每个数都属于集合S.小C用这个生成器生 ...
随机推荐
- redis支持的数据类型有哪些?
string,list,hash,set,zset 底层实现数据结构 数据结构 String sds struct sdshdr{ //等于 SDS 保存字符串的长度 int len; //记录 bu ...
- 第一次上传代码到gitee
初始化 git init 添加文件到本地仓库 git add . 提交文件到本地仓库 git remote add origin 仓库地址 拉去远程仓库代码 git pull origin maste ...
- .NET Core程序发布报错:project.assets.json”没有“.NETCoreApp,Version=v3.1/win-x64”的目标。确保已运行还原,且“netcoreapp3.1”已包含在项目的 TargetFrameworks中。
在控制台中使用命令发布.NET Core程序的时候,报如下的错误: project.assets.json"没有".NETCoreApp,Version=v3.1/win-x64& ...
- 08.SpringMVC之方法返回值
返回ModelAndView Controller类方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view.之前我就已讲过,在此并不过多赘述. 返回void 在Cont ...
- CentOS 6.x 系统中安装原生 Hadoop 2
2020年整理博客发现原文地址已经失效,推荐学习地址厦门大学数据库实验室 本教程适合于在 CentOS 6.x 系统中安装原生 Hadoop 2,适用于Hadoop 2.7.1, Hadoop 2.6 ...
- MySQL时间戳、字符串、日期
1.时间转字符串:date_format(date, format) SELECT date_format(now(), '%Y-%m-%d') 2.时间转时间戳:unix_timestamp() S ...
- mysql批量新增的语法
?useUnicode=true//语序编码反射光hi &characterEncoding=UTF-8//字符 &autoReconnect=true//自动连接 &useA ...
- APMserv 5.2.6 安装教程
1.下载APMServ5.2.6.rar压缩包后解压,得到文件APMServ5.1.2.exe,其余两个没什么大用,APMServ解压缩说明.txt可以看一下,里面详细介绍了APMServ的功能和注意 ...
- (一)Superset 1.3图表篇——Table
本系列文章基于Superset 1.3.0版本.1.3.0版本目前支持分布,趋势,地理等等类型共59张图表.本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程. 而且目前 ...
- 机械硬盘换到SSD后系统引导报错代码0xc000000e
由于机械硬盘IO不够用,系统使用起来非常的缓慢,特意购买了新的SSD进行了替换.机械硬盘的IO在70左右,SSD的IO在1000-4000左右指普通消费SSD. 由于不想安装系统,就直接把机械硬盘的数 ...