传送门


problem

大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观。
他的同学可以分为四类:一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢 rap,还有一部分最喜欢篮球。

若队列中 k,k+1,k+2,k+3k,k+1,k+2,k+3k,k+1,k+2,k+3 位置上的同学依次,最喜欢唱、最喜欢跳、最喜欢 rap、最喜欢篮球,他们就会聚在一起讨论蔡徐坤。
大中锋不希望这种事情发生,因为这会使得队伍显得很乱。

大中锋想知道有多少种排队的方法,不会有学生聚在一起讨论蔡徐坤。
两个学生队伍被认为是不同的,当且仅当两个队伍中至少有一个位置上的学生的喜好不同。
由于合法的队伍可能会有很多种,种类数对 998244353998244353998244353 取模。

学生中最喜欢唱的人数、最喜欢跳的人数、最喜欢 rap 的人数和最喜欢篮球的人数分别为 A,B,C,DA,B,C,DA,B,C,D。

数据范围:n≤1000n≤1000n≤1000,A,B,C,D≤500A,B,C,D≤500A,B,C,D≤500。


solution

为了方便,我们把要讨论蔡徐坤的段称为 “““cxk 段”””。

那么一个比较显然的思路就是枚举 cxk 段的数量然后容斥。从nnn 个数中选 iii 个 cxk 段的方案数是 Cn−3iiC_{n-3i}^{i}Cn−3ii​,因为每个 cxk 段占 444 个位置,那么段头只能在 n−3in-3in−3i 个位置里面选,所以:

ans=∑i=0min⁡(a,b,c,d,⌊n4⌋)(−1)i(n−3ii)fians=\sum_{i=0}^{\min(a,b,c,d,\lfloor\frac n 4\rfloor)}(-1)^i\binom {n-3i} i f_ians=i=0∑min(a,b,c,d,⌊4n​⌋)​(−1)i(in−3i​)fi​

其中 fif_ifi​ 表示在剩下的 n−4in-4in−4i 个位置上选人的方案数。现在每个部分剩下的人分别有 A−i,B−i,C−i,D−iA-i,B-i,C-i,D-iA−i,B−i,C−i,D−i 个。

这就相当于求有重复元素的排列

如果 A+B+C+D=nA+B+C+D=nA+B+C+D=n 的话,这一部分贡献应是 (n−4i)!(A−i)!(B−i)!(C−i)!(D−i)!\frac{(n-4i)!}{(A-i)!(B-i)!(C-i)!(D-i)!}(A−i)!(B−i)!(C−i)!(D−i)!(n−4i)!​。

那么如果 A+B+C+D>nA+B+C+D>nA+B+C+D>n 的话,我们直接枚举,即:

fi=∑a=0A−i∑b=0B−i∑c=0C−i∑d=0D−i[a+b+c+d=n−4i](n−4i)!a!b!c!d!=(n−4i)!∑a=0A−i∑b=0B−i∑c=0C−i∑d=0D−i[a+b+c+d=n−4i]1a!1b!1c!1d!\begin{aligned} f_i&=\sum_{a=0}^{A-i}\sum_{b=0}^{B-i}\sum_{c=0}^{C-i}\sum_{d=0}^{D-i}[a+b+c+d=n-4i]\frac{(n-4i)!}{a!b!c!d!}\\ &=(n-4i)!\sum_{a=0}^{A-i}\sum_{b=0}^{B-i}\sum_{c=0}^{C-i}\sum_{d=0}^{D-i}[a+b+c+d=n-4i]\frac{1}{a!}\frac{1}{b!}\frac{1}{c!}\frac{1}{d!} \end{aligned}fi​​=a=0∑A−i​b=0∑B−i​c=0∑C−i​d=0∑D−i​[a+b+c+d=n−4i]a!b!c!d!(n−4i)!​=(n−4i)!a=0∑A−i​b=0∑B−i​c=0∑C−i​d=0∑D−i​[a+b+c+d=n−4i]a!1​b!1​c!1​d!1​​

这是一个四维的卷积,直接 nttnttntt 做就可以了。

时间复杂度 O(n2log⁡n)O(n^2\log n)O(n2logn)。


code

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define N 5005
#define P 998244353
using namespace std;
typedef vector<int> poly;
const int g=3;
int n,a,b,c,d,up,ans,pos[N],fac[N],ifac[N];
int add(int x,int y)  {return x+y>=P?x+y-P:x+y;}
int dec(int x,int y)  {return x-y< 0?x-y+P:x-y;}
int mul(int x,int y)  {return 1ll*x*y%P;}
int power(int a,int b){int ans=1;for(;b;b>>=1,a=mul(a,a))  if(b&1)  ans=mul(ans,a);return ans;
}
int L=12,*w[13];
void init_fac(){fac[0]=fac[1]=1;for(int i=2;i<N;++i)  fac[i]=mul(fac[i-1],i);ifac[N-1]=power(fac[N-1],P-2);for(int i=N-2;~i;--i)  ifac[i]=mul(ifac[i+1],i+1);
}
int C(int n,int m)  {return mul(fac[n],mul(ifac[m],ifac[n-m]));}
void init_w(){for(int i=1;i<=L;++i)w[i]=new int[1<<(i-1)];int now=power(g,(P-1)/(1<<L));w[L][0]=1;for(int i=1;i<(1<<(L-1));++i)  w[L][i]=mul(w[L][i-1],now);for(int i=L-1;i;--i)for(int j=0;j<(1<<(i-1));++j)w[i][j]=w[i+1][j<<1];
}
void init(int lim){for(int i=0;i<lim;++i)  pos[i]=(pos[i>>1]>>1)|((i&1)*(lim>>1));
}
void NTT(poly &f,int lim,int type){for(int i=0;i<lim;++i)if(pos[i]>i)  swap(f[i],f[pos[i]]);for(int mid=1,l=1;mid<lim;mid<<=1,++l){for(int i=0;i<lim;i+=(mid<<1)){for(int j=0;j<mid;++j){int p0=f[i+j],p1=mul(f[i+j+mid],w[l][j]);f[i+j]=add(p0,p1),f[i+j+mid]=dec(p0,p1);}}}if(type==-1&&(reverse(f.begin()+1,f.begin()+lim),1)){int inv=power(lim,P-2);for(int i=0;i<lim;++i)  f[i]=mul(f[i],inv);}
}
int calc(int x){int ans=C(n-3*x,x);poly A(0),B(0),C(0),D(0);for(int i=0;i<=a-x;++i)  A.push_back(ifac[i]);for(int i=0;i<=b-x;++i)  B.push_back(ifac[i]);for(int i=0;i<=c-x;++i)  C.push_back(ifac[i]);for(int i=0;i<=d-x;++i)  D.push_back(ifac[i]);int lim=1,len=A.size()+B.size()+C.size()+D.size()-3;while(lim<len)lim<<=1;init(lim);A.resize(lim),NTT(A,lim,1);B.resize(lim),NTT(B,lim,1);C.resize(lim),NTT(C,lim,1);D.resize(lim),NTT(D,lim,1);for(int i=0;i<lim;++i)  A[i]=1ll*A[i]*B[i]%P*C[i]%P*D[i]%P;NTT(A,lim,-1),A.resize(len);return mul(ans,mul(fac[n-4*x],A[n-4*x]));
}
int main(){init_w(),init_fac();scanf("%d%d%d%d%d%d",&n,&a,&b,&c,&d);up=min(min(min(a,b),min(c,d)),n/4);for(int i=0;i<=up;++i){ans=(i&1)?dec(ans,calc(i)):add(ans,calc(i));}printf("%d\n",ans);return 0;
}

【TJOI 2019】唱、跳、rap和篮球相关推荐

  1. 一个摄像头就能让虚拟人唱跳rap,抖音即可玩

    允中 发自 凹非寺 量子位 | 公众号 QbitAI 全身动作捕捉,现在无需昂贵的动捕设备,只要一个摄像头就能轻松实现. 并且就在抖音上,人人都能上手体验. 上面这段虚拟数字形象跳舞的视频采用了抖音直 ...

  2. 3D模型学会了「唱、跳、Rap、篮球」,程序员们全沉迷「鸡你太美」

    继 B 站之后,GitHub 网友也开始沉迷「鸡你太美」,让 3D 姿态也学会了「唱.跳.Rap.篮球」,而且动作准确度和连贯性似乎一点也不输练习时长两年半的练习生. 看了这段 demo 之后,网友戏 ...

  3. 我写小程序像菜虚鲲——1、唱,跳,rap,篮球

    引言 大家好,我是练习时长两年半的个人练习生菜虚鲲,我喜欢唱,跳,rap,篮球,Music! 为了避免律师含,就不po鲲鲲的原图咯~ 在小作坊待久了,都忘记自己的本职工作当初进来是一枚Android开 ...

  4. [TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

    文章目录 题目 题解 code1(NTT) code2(EGF+卷积) 题目 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观.他的同学可以分为四类:一部分最喜欢唱.一部分最喜欢 ...

  5. 练习时长两年半,二本学历,没背景,会唱跳篮球,美团四面成功拿下offer

    个人背景 又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群 ...

  6. 2019.3运动手环识别篮球运球手势的算法工作进度

    问题描述: 由加速度传感器和陀螺仪采集的数据保存格式为N行7列的txt文件,前三列分别为xyz轴的加速度,后四列分别为四元数.采样时间间隔相等. 采集的数据为高手运球(high)30个.低手(low) ...

  7. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...

  8. 当周杰伦把QQ音乐干翻的时候,作为程序猿我看到了什么?

    点击蓝字关注我吧 1 别人都会唱了,而我还没付钱! 2019年9月16日晚23点整,周杰伦发布新歌<说好不哭>. 我经过一系列猛如虎的操作: 咦!这啥? 发生错误了?what the fu ...

  9. Vue第一部分(2): 数据的渲染

    插值表达式 数据绑定最常见的形式就是使用 {{值}} (双大括号)的文本插值: <div id="app"><h1>{{msg}}</h1>&l ...

  10. Python多线程(自学必备 超详细)

    多线程技术 多任务 1.1 多任务的概念 多任务:在同一时间内执行多个任务[可以把每个任务理解为生活当中的每个活] 1.2 现实生活中的多任务 操作系统可以同时运行多个任务.比如,你一边打游戏,一边和 ...

最新文章

  1. Tomcat介绍、安装JDK、安装Tomcat
  2. 【转】怎样判断自己掌握了学到的新知识
  3. D. Anton and Chess 模拟题 + 读题
  4. redis 值字符串前面部分乱码_StringBoot 整合Redis解决存储乱码(通过StringRedisSerializer来进行序列化)...
  5. 步骤一:入门linux基础/01Linux简介和安装/003Linux系统的多面性
  6. java 安全发布对象_Java安全的发布对象
  7. 【转载】100多个很有用的JavaScript函数以及基础写法大集合
  8. 关于APKsmail中加入代码报错All register args must fit in 4 bits
  9. 51nod 最小方差
  10. python画五角星代码_如何用python画一个五角星_python绘制五角形教程
  11. win10微软拼音输入法无提示怎么办?
  12. 利用PowerShell把多个文件压缩打包
  13. 德国IT民工找工有感
  14. 微信小程序项目-最常用网盘助手
  15. 二叉树的深度和广度优先
  16. 1006 - 打印星号三角形
  17. android 从顶部弹出的SnackBar
  18. 魔百盒哪款型号配置高_哪种电脑配置好 这两款电脑配置高良心价格
  19. C语言中的EOF和feof()
  20. div + css 实现页面居中显示

热门文章

  1. html 阴历阳历转换,本人花了一个星期的时间,使用ASP代码获得公历并转换成农历时间(2021年至2100年)...
  2. 如何做gif动图?手把手教你在线制作动图
  3. 中国十大会计师事务所排名公布!刚刚,中注协正式通知!
  4. 信息高速公路体现计算机的网络化,信息高速公路主要体现了计算机在什么方面的发展趋势...
  5. 浅谈Nacos中的CAP
  6. 拜耳新一代犬体内驱虫药拜宠清登陆中国市场
  7. RISC-V嵌入式开发入门篇2:RISC-V汇编语言程序设计(下)
  8. php怎么求最小公倍数,最小公倍数算法
  9. vue 使用 createjs 绘制扇形
  10. 机器人肖恩百度云网盘_《探险活宝遥远国度》百度云(全4集完结版)网盘资源【1080p】完整无删减资源共享...