Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】
当时看到这道题的时候我的脑子可能是这样的:
My left brain has nothing right, and my right brain has nothing left.
总之,看到"没有鸡你太美"这一类就直接想容斥,转化为”选出$i$个鸡你太美“
看到排列问题,直接想指数型生成函数。
设$m=\min(\frac{n}{4},a,b,c,d)$
我们使用万年不变的捆绑法,将鸡你太美当做整体考虑,即在$n-3i$个元素中选$i$个作为鸡你太美,再对其他四种进行全排列。
$$ans=\sum_{i=0}^m(-1)^i(n-4i)!\binom{n-3i}{i}\sum_{i_1\leq a-i}\sum_{i_2\leq b-i}\sum_{i_3\leq c-i}\sum_{i_4\leq d-i}\frac{1}{\prod i_j!}[\sum i_j=n-4i]$$
$$\sum_{i=0}^m(-1)^i\frac{(n-3i)!}{i!}\sum_{i_1\leq a-i}\sum_{i_2\leq b-i}\sum_{i_3\leq c-i}\sum_{i_4\leq d-i}\frac{1}{\prod i_j!}[\sum i_j=n-4i]$$
后面那一长串可以用NTT优化计算。
时间复杂度$O(n^2\log n)$,听说有直接dp的$O(n^2)$做法,但这个生成函数的做法应该是无脑多了。
1 #include<bits/stdc++.h> 2 #define Rint register int 3 using namespace std; 4 typedef long long LL; 5 const int N = 1 << 12, mod = 998244353, g = 3, gi = 332748118; 6 inline int kasumi(int a, int b){ 7 int res = 1; 8 while(b){ 9 if(b & 1) res = (LL) res * a % mod; 10 a = (LL) a * a % mod; 11 b >>= 1; 12 } 13 return res; 14 } 15 int fac[N], inv[N]; 16 inline void init(int n){ 17 fac[0] = 1; 18 for(Rint i = 1;i <= n;i ++) fac[i] = (LL) i * fac[i - 1] % mod; 19 inv[n] = kasumi(fac[n], mod - 2); 20 for(Rint i = n;i;i --) inv[i - 1] = (LL) inv[i] * i % mod; 21 } 22 int rev[N]; 23 inline int calrev(int n){ 24 int limit = 1, L = -1; 25 while(limit <= n){limit <<= 1; L ++;} 26 for(Rint i = 0;i < limit;i ++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << L); 27 return limit; 28 } 29 inline void NTT(int *A, int limit, int type){ 30 for(Rint i = 0;i < limit;i ++) if(i < rev[i]) swap(A[i], A[rev[i]]); 31 for(Rint mid = 1;mid < limit;mid <<= 1){ 32 int Wn = kasumi(type == 1 ? g : gi, (mod - 1) / (mid << 1)); 33 for(Rint j = 0;j < limit;j += mid << 1){ 34 int w = 1; 35 for(Rint k = 0;k < mid;k ++, w = (LL) w * Wn % mod){ 36 int x = A[j + k], y = (LL) w * A[j + k + mid] % mod; 37 A[j + k] = (x + y) % mod; 38 A[j + k + mid] = (x - y + mod) % mod; 39 } 40 } 41 } 42 if(type == -1){ 43 int inv = kasumi(limit, mod - 2); 44 for(Rint i = 0;i < limit;i ++) 45 A[i] = (LL) A[i] * inv % mod; 46 } 47 } 48 int n, a, b, c, d, m, ans, A[N], B[N], C[N], D[N]; 49 int main(){ 50 scanf("%d%d%d%d%d", &n, &a, &b, &c, &d); 51 init(a + b + c + d); 52 m = min(n >> 2, min(min(a, b), min(c, d))); 53 for(Rint i = 0;i <= m;i ++){ 54 int limit = calrev(a + b + c + d - (i << 2)); 55 for(Rint j = 0;j < limit;j ++){ 56 A[j] = inv[j] * (j <= a - i); 57 B[j] = inv[j] * (j <= b - i); 58 C[j] = inv[j] * (j <= c - i); 59 D[j] = inv[j] * (j <= d - i); 60 } 61 NTT(A, limit, 1); NTT(B, limit, 1); NTT(C, limit, 1); NTT(D, limit, 1); 62 for(Rint j = 0;j < limit;j ++) A[j] = (LL) A[j] * B[j] % mod * C[j] % mod * D[j] % mod; 63 NTT(A, limit, -1); 64 int tmp = (LL) A[n - (i << 2)] * fac[n - 3 * i] % mod * inv[i] % mod; 65 if(i & 1) ans = (ans - tmp + mod) % mod; 66 else ans = (ans + tmp) % mod; 67 } 68 printf("%d", ans); 69 }
Luogu5339
转载于:https://www.cnblogs.com/AThousandMoons/p/10991925.html
Luogu5339 [TJOI2019]唱、跳、rap和篮球 【生成函数,NTT】相关推荐
- 一个摄像头就能让虚拟人唱跳rap,抖音即可玩
允中 发自 凹非寺 量子位 | 公众号 QbitAI 全身动作捕捉,现在无需昂贵的动捕设备,只要一个摄像头就能轻松实现. 并且就在抖音上,人人都能上手体验. 上面这段虚拟数字形象跳舞的视频采用了抖音直 ...
- 3D模型学会了「唱、跳、Rap、篮球」,程序员们全沉迷「鸡你太美」
继 B 站之后,GitHub 网友也开始沉迷「鸡你太美」,让 3D 姿态也学会了「唱.跳.Rap.篮球」,而且动作准确度和连贯性似乎一点也不输练习时长两年半的练习生. 看了这段 demo 之后,网友戏 ...
- 我写小程序像菜虚鲲——1、唱,跳,rap,篮球
引言 大家好,我是练习时长两年半的个人练习生菜虚鲲,我喜欢唱,跳,rap,篮球,Music! 为了避免律师含,就不po鲲鲲的原图咯~ 在小作坊待久了,都忘记自己的本职工作当初进来是一枚Android开 ...
- [TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)
文章目录 题目 题解 code1(NTT) code2(EGF+卷积) 题目 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观.他的同学可以分为四类:一部分最喜欢唱.一部分最喜欢 ...
- 练习时长两年半,二本学历,没背景,会唱跳篮球,美团四面成功拿下offer
个人背景 又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群 ...
- 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...
- P2000-拯救世界【生成函数,NTT】
正题 题目链接:https://www.luogu.com.cn/problem/P2000 题目大意 十种东西,有要求 金神石A的块数必须是 6 的倍数. 木神石A最多用 9 块. 水神石A最多用 ...
- 【洛谷 P5850】 calc加强版(生成函数+NTT)
传送门 先看做无序的最后乘上 n ! n! n! 显然可以构造生成函数 ∏ ( 1 + i x ) \prod(1+ix) ∏(1+ix) 分治 n t t ntt ntt好像也可以过?不过不知道为啥 ...
- HDU - 6589 Sequence (生成函数+NTT)
题目链接 设序列a的生成函数$\large f(x)=\sum\limits_{i=0}^{n-1}a_ix^i$,则操作1,2,3分别对应将$f(x)$乘上$\Large\frac{1}{1-x}, ...
- Vue第一部分(2): 数据的渲染
插值表达式 数据绑定最常见的形式就是使用 {{值}} (双大括号)的文本插值: <div id="app"><h1>{{msg}}</h1>&l ...
最新文章
- Redis缓存失效策略思考
- Android Training - 使用IntentService运行任务(Lesson 2 - 发送任务给IntentService)
- 代表Java未来的ZGC深度剖析,牛逼!
- springmvc的配置
- java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文
- Linux系统安装与使用基础实验报告
- 全球及中国冻干菠萝行业市场运行模式及未来发展前景分析报告2022-2028年
- 笔记--利用python下载bilibili视频
- Iphone版同步推闪退问题
- 巨强大的免费LOGO在线制作工具
- {电脑救助站}常用知识4
- oracle 中int字节,oracle 数据类型
- 第七章 中子----中子源、应用、能量分类、探测四个基本过程
- AirVO: An Illumination-Robust Point-Line Visual Odometry阅读
- CLISP 实现记录:5.数据和控制流
- 如何下载并安装Visual Studio
- 机器学习(十五) - Bias vs. Variance
- 什么是装饰器 python_python三大神器===》装饰器
- r语言 python 互联网数据分析_对比R语言和Python,教你实现回归分析
- 自定义view-滑动刻度尺计算金额
热门文章
- STM32L476应用开发之七:流量的PID控制
- 服务器linux杀网页木马,一次Linux服务器木马查杀经历
- 蓝色简约的工业大学学校网站静态模板
- Excel 2013 查找和替换单元格内换行回车
- python带你过不一样的“清明节”和看神奇的《清明上河图》
- SQL SERVER 2000个人版下载
- 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法...
- 2013年放假安排时间表 法定节假日安排通知 ( IS2120@BG57IV3)
- audioread函数未定义_我在MATLAB中运行下面的程序, 提示未定义函数或变量wavread 这是为什么呀?求解答...
- 解决Chrome浏览器登录web系统一直报“验证码错误问题“