[TJOI2019]唱、跳、rap和篮球

这么多人过没人写题解啊

那我就随便说说了嗷

这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往更简单。

这个题呢直接要求存在发现还不咋好求,反正就是存在嘛我们就容斥好了。

呐,我们就枚举至少有多少段(唱跳rap篮球)。

假设有\(i\)段,那么枚举一下这\(i\)段的位置,这是\(\binom{n-3i}{i}\)的。

就相当于给定长度为\(n-3i\)的空格,选出\(i\)个空格为(唱跳rap篮球)的起始点就好了。

假设每种人分别有\(num[1]\)到\(num[4]\)个,把他们都\(-i\),就相当于求剩下这些人随意排列的方案数咯。

假设第\(i\)种人用了\(now[i]\)个,那么方案数为
\(\frac{(n-4i)!}{\prod now[j]!}\)。

这东西就是拿生成函数搞一搞就好了。

就是第一个人的生成函数是\(\sum\limits_{i=0}^{num[1]} \frac{x^i}{i!}\)。

把这四个生成函数乘一起,最后返回第\(n-4i\)项乘以\((n-4i)!\)就好啦。

贴个代码

#include <bits/stdc++.h>
#define N 1010
using namespace std;
typedef long long ll;
const int mod = 998244353 ;
int C[N][N],num[5],len[5],fac[N<<2],inv[N<<2],b[5][N<<2];
int n;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0,f=1; char c=nc(); while(c<48) {if(c=='-') f=-1; c=nc();} while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
int qpow(int x,int y)
{int ans=1;while(y){if(y&1) ans=(ll)ans*x%mod;y>>=1;x=(ll)x*x%mod;}return ans;
}
void init()
{fac[0]=1; for(int i=1;i<=1000;i++) fac[i]=(ll)fac[i-1]*i%mod;inv[0]=1; for(int i=1;i<=1000;i++) inv[i]=qpow(fac[i],mod-2);
}
void ntt(int *a,int len,int flg)
{int i,j,k,t,w,x,tmp;for(i=k=0;i<len;i++){if(i>k) swap(a[i],a[k]);for(j=len>>1;(k^=j)<j;j>>=1);}for(k=2;k<=len;k<<=1){t=k>>1;x=qpow(3,(mod-1)/k);if(flg==-1) x=qpow(x,mod-2);for(i=0;i<len;i+=k)for(j=i,w=1;j<i+t;j++){tmp=(ll)a[j+t]*w%mod;a[j+t]=(a[j]-tmp+mod)%mod;a[j]=(a[j]+tmp)%mod;w=(ll)w*x%mod;}}if(flg==-1) for(t=qpow(len,mod-2),i=0;i<len;i++) a[i]=(ll)a[i]*t%mod;
}
int calc(int k)
{int l=1;while(l<=max((num[4]-k)<<1,(n-4*k)<<1)) l<<=1;while(l<=(num[4]<<2)) l<<=1;for(int i=1;i<=4;i++){len[i]=num[i]-k;for(int j=0;j<=l;j++) b[i][j]=0;}for(int i=1;i<=4;i++) for(int j=0;j<=len[i];j++) b[i][j]=inv[j];for(int i=1;i<=4;i++) ntt(b[i],l,1);for(int i=2;i<=4;i++) for(int j=0;j<l;j++) b[1][j]=(ll)b[1][j]*b[i][j]%mod;ntt(b[1],l,-1);return (ll)b[1][n-4*k]*fac[n-4*k]%mod;
}
int main()
{n=rd(); for(int i=1;i<=4;i++) num[i]=rd();for(int i=0;i<=n;i++){C[i][0]=1;for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}sort(num+1,num+5);int l=1;while(l<=(num[4]<<2)) l<<=1;init();int ans=0;for(int i=0;(i<<2)<=min(n,num[1]<<2);i++){int mdl=(ll)calc(i)*C[n-3*i][i]%mod;if(i&1) (ans-=mdl)%=mod;else (ans+=mdl)%=mod;}printf("%d\n",(ans+mod)%mod);return 0;
}

转载于:https://www.cnblogs.com/ShuraK/p/10805548.html

[TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt相关推荐

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

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

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

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

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

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

  4. 复习Java异常处理_异常分类_自定义异常_线程初步了解

    复习Java异常处理_异常分类_自定义异常_线程 主要内容 异常.线程 教学目标 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点 ...

  5. Python_机器学习_算法_第4章_4.决策树算法

    Python_机器学习_算法_第4章_4.决策树算法 文章目录 Python_机器学习_算法_第4章_4.决策树算法 决策树算法 学习目标 4.1 决策树算法简介 学习目标 小结 4.2 决策树分类原 ...

  6. 证券行业信息化_感悟_我遇到了哪些系统故障?系统故障如何避免?如何看待系统故障?

    转自 https://stanleyyan.wordpress.com/2010/10/06/%E8%AF%81%E5%88%B8%E8%A1%8C%E4%B8%9A%E4%BF%A1%E6%81%A ...

  7. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  8. MATLAB_4-形态学_腐蚀_膨胀_灰度图的腐蚀以及膨胀_开运算_闭运算_文章末尾有几个素材例子

    素材链接: MATLAB_4-形态学_课程需要的素材 记住单词拼写: 腐蚀 erode 膨胀 dilate 开运算 open 闭运算 close 图像重建 imreconstruct reconstr ...

  9. 计算机会计课程试题及答案,计算机会计第2次作业_报表_附答案

    计算机会计第2次作业_报表_附答案 (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 . . . . .<计算机会计>课程作业 ...

  10. java语言仅支持单重继承_java语言程序设计基础篇习题_复习题_第十一章

    java语言程序设计基础篇习题_复习题_第十一章 11.1 下面说法是真是假?一个子类是父类的子集. 11.2 使用什么关键字来定义一个子类 11.3 什么是单一继承?什么是多重继承?java支持多重 ...

最新文章

  1. 开工了!三位大咖给你指路:未来 3~5 年内,哪个方向的机器学习人才最紧缺?
  2. Android 告急!
  3. FarPoint 应用总结
  4. 猴年如何抢红包?错过这秘籍可能错过几个亿!
  5. SpringMVC的请求-文件上传-多文件上传的代码实现
  6. apache自定义虚拟主机日志格式
  7. jdk基础之Object类getClass()方法
  8. matlab牛顿差值法函数,matlab牛顿插值函数
  9. 基于大数据的智慧旅游数据分析系统
  10. C语言 陶陶摘苹果 数组,陶陶摘苹果-题解(C++代码)
  11. 一键导出微信所有聊天记录的小工具
  12. 夏天想美美的出门?店湾妹的“明星穿搭教科书”,很美有木有?
  13. linux下查看进程占用网络,linux怎么查看进程占用端口
  14. Proximal Policy Optimization Algorithms
  15. 如何预防恶意软件的攻击?10项防御措施来帮您!
  16. 我喜欢你c语言程序设计,我喜欢你,表白代码怎么说
  17. oracle 中的递归查询
  18. windows getLastError 错误码大全
  19. Eclipse 10 hotest-keys
  20. KYC功能介绍:为客户提供新的机会

热门文章

  1. 数据库设计——关系数据理论(超详细)
  2. 设计师:设计师的知识储备之异形曲面设计 巴洛克、洛可可 设计理论(三角形构图、平衡式构图、三分法构图 、九宫格构图)之详细攻略
  3. 国内的云主机靠谱吗?万网如何?互联网创业产品选择云主机还是租用独享服务器合适?
  4. STM32+二维码扫描模块(QR_Scaner)实现门禁系统
  5. 武汉晴川学院计科一班软件工程需求分析
  6. 初学者如何学习好嵌入式开发?讲解嵌入式学习教程
  7. python读取excel数据绘制简单曲线图
  8. Python--单引号、双引号、三引号用法
  9. python对气象工作有没有用_Python语言在气象资料下载中的应用
  10. java 计算年龄_Java 根据出生日期计算年龄