[CTS2019]珍珠(NTT+生成函数+组合计数+容斥)
这题72分做法挺显然的(也是我VP的分):
对于n,D<=5000的数据,可以记录f[i][j]表示到第i次随机有j个数字未匹配的方案,直接O(nD)的DP转移即可。
对于D<=300的数据,根据转移系数建立矩阵,跑一遍矩阵快速幂,复杂度O(D3logn),不过要注意卡常数,因为是稀疏矩阵可以判掉无用状态。
对于m较小数据,m=0快速幂,m=1为Dn-A(n,D),m=2暴力讨论一下有没有出现>=1次的值,如果有,唯一出现>=1次的值是出现2次还是3次。
当然还是水平低啊不会正解。正解是生成函数。转化是对的,匹配数>=m就是未匹配的数<=min(D,n-2m),未匹配的数实际上就是出现奇数次的数。一个数出现奇数次的生成函数是:(ex+e-x)/2,偶数次为:(ex-e-x)/2。然后ans=n!(Σ((ex+e-x)/2+y(ex-e-x)/2)D[xn][yk]),其中0<=k<=n-2m,由于我不会用LaTeX,打数学公式太长太慢了,直接写最终式子的结果:ans=(1/2)DΣC(D,i)(2i-D)nΣ(1-y)i(1-y)D-i[yk],其中0<=i<=D,0<=k<=n-2m,然后将式子展开后发现后面的是一个阶乘式,阶乘展开后又是一个卷积形式,再加上mod=998244353,直接NTT处理即可。
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+,mod=,inv2=;
int D,n,m,nn,ans,fac[N],inv[N],R[N],f[N],A[N],B[N];
int qpow(int a,int b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%mod;
a=1ll*a*a%mod,b>>=;
}
return ret;
}
void NTT(int*a,int tp)
{
for(int i=;i<nn;i++)if(i<R[i])swap(a[i],a[R[i]]);
for(int i=;i<nn;i<<=)
{
int wn=qpow(,mod/(i<<));
if(tp==-)wn=qpow(wn,mod-);
for(int j=;j<nn;j+=i<<)
for(int k=,w=;k<i;k++,w=1ll*w*wn%mod)
{
int x=a[j+k],y=1ll*w*a[i+j+k]%mod;
a[j+k]=(x+y)%mod,a[i+j+k]=(x-y+mod)%mod;
}
}
if(tp==)return;
int invn=qpow(nn,mod-);
for(int i=;i<nn;i++)a[i]=1ll*a[i]*invn%mod;
}
int C(int a,int b){return 1ll*fac[a]*inv[b]%mod*inv[a-b]%mod;}
int main()
{
scanf("%d%d%d",&D,&n,&m);
m=n-*m;
fac[]=;for(int i=;i<=1e5;i++)fac[i]=1ll*fac[i-]*i%mod;
inv[]=qpow(fac[],mod-);for(int i=1e5;i;i--)inv[i-]=1ll*inv[i]*i%mod;
if(m>=D){printf("%d",qpow(D,n));return ;}
if(m<=)
{
for(int i=-D;i<=D;i++)
if((D+i)%==)ans=(ans+1ll*qpow(i+mod,n)*C(D,D+i>>))%mod;
ans=1ll*ans*qpow(inv2,D)%mod;
printf("%d",ans);
return ;
}
A[]=;for(int i=;i<=D;i++)A[i]=1ll*C(i-,m)*(m&?mod-:)%mod;
reverse(A,A+D+);
for(int i=;i<=D;i++)A[i]=1ll*A[i]*qpow(,i)%mod*inv[i]%mod;
for(int i=;i<=D;i++)B[i]=1ll*inv[i]*(i&?mod-:)%mod;
nn=;int L=;
while(nn<=D*)nn*=,L++;
for(int i=;i<nn;i++)R[i]=R[i>>]>>|((i&)<<L-);
NTT(A,),NTT(B,);
for(int i=;i<nn;i++)f[i]=1ll*A[i]*B[i]%mod;
NTT(f,-);
for(int i=;i<=D;i++)ans=(ans+1ll*C(D,i)*qpow(mod+*i-D,n)%mod*f[i]%mod*fac[i])%mod;
ans=1ll*ans*qpow(inv2,D)%mod;
printf("%d",ans);
}
[CTS2019]珍珠(NTT+生成函数+组合计数+容斥)的更多相关文章
- BZOJ 3456 NTT图的计数 容斥
思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...
- bzoj 2839 集合计数 容斥\广义容斥
LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...
- bzoj2839: 集合计数 容斥+组合
2839: 集合计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 523 Solved: 287[Submit][Status][Discuss] ...
- Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)
显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...
- BZOJ 3294: [Cqoi2011]放棋子 计数 + 容斥 + 组合
比较头疼的计数题. 我们发现,放置一个棋子会使得该棋子所在的1个行和1个列都只能放同种棋子. 定义状态 $f_{i,j,k}$ 表示目前已使用了 $i$ 个行,$j$ 个列,并放置了前 $k$ 种棋子 ...
- BZOJ2839:集合计数(容斥,组合数学)
Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...
- BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)
题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...
- SPOJ - AMR11H Array Diversity (水题排列组合或容斥)
题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...
- 数学(组合,容斥):COGS 1220. 盒子与球
1220. 盒子与球 ★ 输入文件:boxball.in 输出文件:boxball.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 现有r个互不相同的盒子和n ...
随机推荐
- JPA 开发中遇到的错误
JPA 开发中遇到的错误 (2011-07-13 16:56:12) 转载▼ 标签: 杂谈 分类: Java/J2EE 常见异常1.异常信息:org.hibernate.hql.ast.QuerySy ...
- python 变量搜寻顺序法则LEGB之E注意事项
众所周知,在python中,变量不需要事先声明,赋值后,即可调用使用.而调用的法则遵从LEGB法则,其中L为local,E为enclosing,G为Global,B为built-in,即变量首先在局部 ...
- Centos7.4系统 httpd模式搭建文件服务器
环境:服务环境:centos7.4 说明:搭建Apache文件服务器,下载路径为/opt/ymyg(下载路径根据实际需要自己定义) 步骤: 1.安装httpd服务 [root@localhost ...
- redhat8 不支持ansible批量管理解决方案
redhat8默认不安装python,因此无法通过python去管理,直接上解决方案. dnf install python3 -y alternatives --set python /usr/bi ...
- 使用 prototype 定义方法和属性
除了可以在类的构造器方法中定义方法和属性外,也可以使用 prototype 定义方法和属性.每个类都有这个属性,该属性是一个静态属性,因此无需实例化,只需使用类引用该属性即可. 1.1 使用 prot ...
- JKS not Found
近期使用Spring Boot开发微信验证的时候, 在获取token时,Idea老是提示Jks not found,网上找资料,都说是SSL的问题 实际解决方法: 重装JDK,将JDK重装之后,运行正 ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 选择数据库
连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库. 从命令提示窗口中选择MySQL数据库 在 mysql> 提示窗口中可以很简单的选择特定的数据库.可以使 ...
- 洛谷P1257(暴力超时)
1.先输入再求勾股定理会超时 2.需要一边输入一边求. #include<iostream> #include<cmath>#include<cstdio> usi ...
- SeetaFaceEngine系列3:Face Identification编译和使用
前面两篇介绍了怎样编译SeetaFace的前两部分,现在就来讲下第三部分Face Identification的编译和使用. 其实,步骤基本上是一直的,如下: 1.新建一个空的DLL工程: 2.修改配 ...
- OpenMP笔记(一)
原文:https://www.bearoom.xyz/2019/02/17/openmp1/ 并行技术有很多种,OpenMP算是比较简单可用的一种,OpenMP全称是 Open Multi-Proce ...