当时看到这道题的时候我的脑子可能是这样的:

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】相关推荐

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

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

  7. P2000-拯救世界【生成函数,NTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P2000 题目大意 十种东西,有要求 金神石A的块数必须是 6 的倍数. 木神石A最多用 9 块. 水神石A最多用 ...

  8. 【洛谷 P5850】 calc加强版(生成函数+NTT)

    传送门 先看做无序的最后乘上 n ! n! n! 显然可以构造生成函数 ∏ ( 1 + i x ) \prod(1+ix) ∏(1+ix) 分治 n t t ntt ntt好像也可以过?不过不知道为啥 ...

  9. 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}, ...

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

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

最新文章

  1. Redis缓存失效策略思考
  2. Android Training - 使用IntentService运行任务(Lesson 2 - 发送任务给IntentService)
  3. 代表Java未来的ZGC深度剖析,牛逼!
  4. springmvc的配置
  5. java电信计费项目论文_基于JAVA开发的电信IP计费系统设计毕业论文
  6. Linux系统安装与使用基础实验报告
  7. 全球及中国冻干菠萝行业市场运行模式及未来发展前景分析报告2022-2028年
  8. 笔记--利用python下载bilibili视频
  9. Iphone版同步推闪退问题
  10. 巨强大的免费LOGO在线制作工具
  11. {电脑救助站}常用知识4
  12. oracle 中int字节,oracle 数据类型
  13. 第七章 中子----中子源、应用、能量分类、探测四个基本过程
  14. AirVO: An Illumination-Robust Point-Line Visual Odometry阅读
  15. CLISP 实现记录:5.数据和控制流
  16. 如何下载并安装Visual Studio
  17. 机器学习(十五) - Bias vs. Variance
  18. 什么是装饰器 python_python三大神器===》装饰器
  19. r语言 python 互联网数据分析_对比R语言和Python,教你实现回归分析
  20. 自定义view-滑动刻度尺计算金额

热门文章

  1. STM32L476应用开发之七:流量的PID控制
  2. 服务器linux杀网页木马,一次Linux服务器木马查杀经历
  3. 蓝色简约的工业大学学校网站静态模板
  4. Excel 2013 查找和替换单元格内换行回车
  5. python带你过不一样的“清明节”和看神奇的《清明上河图》
  6. SQL SERVER 2000个人版下载
  7. 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法...
  8. 2013年放假安排时间表 法定节假日安排通知 ( IS2120@BG57IV3)
  9. audioread函数未定义_我在MATLAB中运行下面的程序, 提示未定义函数或变量wavread 这是为什么呀?求解答...
  10. 解决Chrome浏览器登录web系统一直报“验证码错误问题“