大意: $n$个人, 分别属于$m$个组, 要求选出$k$个人, 使得每组至少有一人, 求方案数.

显然答案为$\prod((1+x)^{a_i}-1)$的第$k$项系数, 分治$FFT$即可.

#include <iostream>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define mid ((l+r)>>1)
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int*,int> poly;
const int N = 4e5+10, P = 998244353, G = 3, Gi = 332748118;
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
int lim,l,A[N],B[N],R[N];
void init(int n) {
for (lim=1,l=0; lim<=n; lim<<=1,++l) ;
REP(i,0,lim-1) R[i]=(R[i>>1]>>1)|((i&1)<<(l-1));
} void NTT(int *J, int tp=1) {
REP(i,0,lim-1) if (i<R[i]) swap(J[i],J[R[i]]);
for (int j=1; j<lim; j<<=1) {
ll T = qpow(tp==1?G:Gi,(P-1)/(j<<1));
for (int k=0; k<lim; k+=j<<1) {
ll t = 1;
for (int l=0; l<j; ++l,t=t*T%P) {
int y = t*J[k+j+l]%P;
J[k+j+l] = (J[k+l]-y)%P;
J[k+l] = (J[k+l]+y)%P;
}
}
}
if (tp==-1) {
ll inv = qpow(lim, P-2);
REP(i,0,lim-1) J[i]=(ll)inv*J[i]%P;
}
} poly mul(poly a, poly b) {
init(a.y+b.y);
REP(i,0,lim-1) A[i]=B[i]=0;
REP(i,0,a.y) A[i]=a.x[i];
REP(i,0,b.y) B[i]=b.x[i];
NTT(A),NTT(B);
poly c(new int[lim],lim-1);
REP(i,0,lim-1) c.x[i]=(ll)A[i]*B[i]%P;
NTT(c.x,-1);
return c;
} int n,m,k,a[N],fac[N],ifac[N];
int C(int n, int m) {
if (m>n) return 0;
return (ll)fac[n]*ifac[m]%P*ifac[n-m]%P;
}
poly solve(int l, int r) {
if (l==r) {
poly ret(new int[a[l]+1],a[l]);
REP(i,1,a[l]) ret.x[i]=C(a[l],i);
return ret;
}
return mul(solve(l,mid),solve(mid+1,r));
} int main() {
fac[0]=ifac[0]=1;
REP(i,1,N-1) fac[i]=(ll)fac[i-1]*i%P;
ifac[N-1]=qpow(fac[N-1],P-2);
PER(i,1,N-2) ifac[i]=(ll)ifac[i+1]*(i+1)%P;
scanf("%d%d%d", &n, &m, &k);
REP(i,1,m) scanf("%d",a+i);
int ans = solve(1,m).x[k];
if (ans<0) ans += P;
printf("%d\n", ans);
}

牛客 133D 挑选队友 (分治FFT)的更多相关文章

  1. 挑选队友 (生成函数 + FFT + 分治)

    链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...

  2. 2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html 题目传送门 - 2018牛客多校赛第三场 D ...

  3. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  4. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  5. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  6. NTT - 牛客

    链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...

  7. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  8. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

  9. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

随机推荐

  1. open suse tumbleweed安装记录

    zypper install imagewriter cmake blender fontforge gimp digikam inkscape  kontact pitivi smplayer si ...

  2. PSO算法

    1.简介粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 .该算 ...

  3. java课后实验性问题4

    课后作业一: 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象? 设计思路:定义类的构造函数时使静态变量i进行i++,即每构 ...

  4. java 设计模式 之 装饰器模式

    装饰器模式的作用 在不修改原先对象核心的功能的情况下,对功能进行增强. 增强对象的功能的途径 通过类继承的方式,对父对象进行增强操作,例如造车是父类,改装跑车,跑车加大灯,改装房车,房车加私人电影院. ...

  5. Mac 上卸载node和npm

    Mac 上卸载node和npm 卸载node依次在终端执行下面的脚本 sudo npm uninstall npm -gsudo rm -rf /usr/local/lib/node /usr/loc ...

  6. kotlin中接口

    使用interface关键字声明,一个类可以多实现,实现方法与类继承相同 接口中的属性和方法都是open的 package loaderman.demo interface myInterface{ ...

  7. tortoiseGit did not exit cleanly (exit code 128)

    安装并配置好tortoiseGit之后,clone项目时,报错: git did not exit cleanly (exit code 128)如下图: 该问题解决方式: 1.确保Pageant启动 ...

  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_13-删除页面-前端-Api调用

    增加删除链接 <el-button size="small" type="text" @click="del(page.row.pageId)& ...

  9. MySQL连接错误:Can't connect to MySQL server on'localhost' (10055)

    在Windows服务器上确认服务器和mysql都是正常运行,但就是连接不上.搜了一下别人的解决方案, 参考这篇https://blog.csdn.net/langren697/article/deta ...

  10. WordPress的默认循环

    WordPress的默认循环是相对我们上一篇的WordPress自定义循环而言的,默认循环是根据链接结构的来查询数据的. 我们知道WordPress模板文件就是根据文件名来找寻模板的,这里的链接结构也 ...