这题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+生成函数+组合计数+容斥)的更多相关文章

  1. BZOJ 3456 NTT图的计数 容斥

    思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...

  2. bzoj 2839 集合计数 容斥\广义容斥

    LINK:集合计数 容斥简单题 却引出我对广义容斥的深思. 一直以来我都不理解广义容斥是为什么 在什么情况下使用. 给一张图: 这张图想要表达的意思就是这道题目的意思 而求的东西也和题目一致. 特点: ...

  3. bzoj2839: 集合计数 容斥+组合

    2839: 集合计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 523  Solved: 287[Submit][Status][Discuss] ...

  4. Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)

    显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...

  5. BZOJ 3294: [Cqoi2011]放棋子 计数 + 容斥 + 组合

    比较头疼的计数题. 我们发现,放置一个棋子会使得该棋子所在的1个行和1个列都只能放同种棋子. 定义状态 $f_{i,j,k}$ 表示目前已使用了 $i$ 个行,$j$ 个列,并放置了前 $k$ 种棋子 ...

  6. BZOJ2839:集合计数(容斥,组合数学)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007. ...

  7. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  8. SPOJ - AMR11H Array Diversity (水题排列组合或容斥)

    题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...

  9. 数学(组合,容斥):COGS 1220. 盒子与球

    1220. 盒子与球 ★   输入文件:boxball.in   输出文件:boxball.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 现有r个互不相同的盒子和n ...

随机推荐

  1. 使用技巧 --- 与VS Code相关

    目的:修改VS Code的注释文本颜色 S1:假设VS Code的安装路径是 %MVSC% S2:文件资源管理器进入目录 %MVSC%\resources\app\extensions\ S3:该目录 ...

  2. vps 跑流量

  3. 关于Wasserstein GAN的一些笔记

    这篇笔记基于上一篇<关于GAN的一些笔记>. 1 GAN的缺陷 由于 $P_G$ 和 $P_{data}$ 它们实际上是 high-dim space 中的 low-dim manifol ...

  4. Android自定义View——仿滴滴出行十大司机评选活动说明

    滴滴出行原版图 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 仿图 ? ? ? ? ? ? 1.分 ...

  5. Android群英传神兵利器读书笔记——第二章:版本控制神器——Git

    本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...

  6. zookeeper基础教程

    一.关于zookeeper Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用 ...

  7. django_filter的values / values_list

    from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagli ...

  8. Linux-异步IO

    1.何为异步IO (1).几乎可以这么认为:异步IO就是操作系统用软件实现的一套中断响应系统. (2).异步IO的工作方法:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处 ...

  9. h5-提升移动端的响应区域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. JAVA初学者——算数运算符

    Hello!大家好,我是浩宇大熊猫,又是学习java的一天,开开森森~ 运算符:也就是对常量或者变量进行操作的符号 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式,不同的 ...