[TJOI2019]唱、跳、rap和篮球 题解
传送门
老年退役选手来写题解了
题意
有aaa个人喜欢唱,bbb个人喜欢跳,ccc个人喜欢rap,ddd个人喜欢篮球,现在要从中选出nnn个人排成一队,使得不存在位置kkk满足第kkk,k+1k+1k+1,k+2k+2k+2,k+3k+3k+3个人依次喜欢唱、跳、rap、篮球,求方案数。
两种方案不同,当且仅当有一个位置上的同学的喜好不同。
题解
为了方便,我们将连续的唱跳rap篮球四个人称为“ikun段”。
现在要计算没有ikun段的方案数并不方便,可以考虑容斥,那么答案显然是
ans=∑i=0min{a,b,c,d,⌊n4⌋}(−1)if(i)ans=\sum\limits_{i=0}^{\min\{a,b,c,d,\lfloor\frac{n}{4}\rfloor\}}(-1)^if(i)ans=i=0∑min{a,b,c,d,⌊4n⌋}(−1)if(i)
其中f(i)f(i)f(i)表示指定iii处ikun段,其它地方任意排列的方案数。
要指定iii处ikun段,注意到它们不能相交,设第jjj处ikun段的开头位置为aja_jaj,显然有
aj+3<aj+1a_j+3<a_{j+1}aj+3<aj+1
1≤a1,ai+3≤n1\leq a_1,a_i+3\leq n1≤a1,ai+3≤n
简单整理一下可以得到
1≤a1<a2−3<a3−6<⋯<aj−3(j−1)≤n−3i1\leq a_1<a_2-3<a_3-6<\cdots<a_j-3(j-1)\leq n-3i1≤a1<a2−3<a3−6<⋯<aj−3(j−1)≤n−3i
因此方案数就是Cn−3iiC_{n-3i}^iCn−3ii。
指定了iii处出现ikun段之后,剩下n−4in-4in−4i个位置任意排列,也就是从a−ia-ia−i个唱、b−ib-ib−i个跳、c−ic-ic−i个rap、d−id-id−i个篮球中选出n−4in-4in−4i个来排列。这是经典的指数型生成函数问题,答案就是h(x)h(x)h(x)的项xn−4ix^{n-4i}xn−4i的系数乘上(n−4i)!(n-4i)!(n−4i)!,其中
h(x)=(∑j=0a−ixjj!)(∑j=0b−ixjj!)(∑j=0c−ixjj!)(∑j=0d−ixjj!)h(x)=\left(\sum\limits_{j=0}^{a-i}\frac{x^j}{j!}\right)\left(\sum\limits_{j=0}^{b-i}\frac{x^j}{j!}\right)\left(\sum\limits_{j=0}^{c-i}\frac{x^j}{j!}\right)\left(\sum\limits_{j=0}^{d-i}\frac{x^j}{j!}\right)h(x)=(j=0∑a−ij!xj)(j=0∑b−ij!xj)(j=0∑c−ij!xj)(j=0∑d−ij!xj)
NTT求卷积即可。
总结一下,我们要求的东西就是
ans=∑i=0min{a,b,c,d,⌊n4⌋}(−1)iCn−3ii(n−4i)![xn−4i]h(x)ans=\sum\limits_{i=0}^{\min\{a,b,c,d,\lfloor\frac{n}{4}\rfloor\}}(-1)^iC_{n-3i}^i(n-4i)![x^{n-4i}]h(x)ans=i=0∑min{a,b,c,d,⌊4n⌋}(−1)iCn−3ii(n−4i)![xn−4i]h(x)
组合数的分母也含有(n−4i)!(n-4i)!(n−4i)!,可以约去,但这其实无所谓。
枚举iii,求卷积O(nlogn)O(n\log n)O(nlogn),总复杂度O(n2logn)O(n^2\log n)O(n2logn)
我怀疑这题暴力求卷积+卡常优化可以比NTT快
#include <cctype>
#include <cstdio>
#include <climits>
#include <algorithm>template <typename T> inline void read(T &x) {int f = 0, c = getchar(); x = 0;while (!isdigit(c)) f |= c == '-', c = getchar();while (isdigit(c)) x = x * 10 + c - 48, c = getchar();if (f) x = -x;
}
template <typename T, typename... Args>
inline void read(T &x, Args&... args) {read(x); read(args...);
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + 48);
}
template <typename T> inline void writeln(T x) { write(x); puts(""); }
template <typename T> inline bool chkmin(T &x, const T &y) { return y < x ? x = y, 1 : 0; }
template <typename T> inline bool chkmax(T &x, const T &y) { return x < y ? x = y, 1 : 0; }typedef long long LL;const int maxn = 1e3 + 7;
const LL P = 998244353, G = 3, Gi = 332748118;inline LL qpow(LL x, LL k) {LL s = 1;for (; k; x = x * x % P, k >>= 1)if (k & 1) s = s * x % P;return s;
}inline void ntt(LL *A, int *r, int lim, int tp) {for (int i = 0; i < lim; ++i)if (i < r[i]) std::swap(A[i], A[r[i]]);for (int mid = 1; mid < lim; mid <<= 1) {LL wn = qpow(tp == 1 ? G : Gi, (P - 1) / (mid << 1));for (int j = 0; j < lim; j += mid << 1) {LL w = 1;for (int k = 0; k < mid; ++k, w = w * wn % P) {LL x = A[j + k], y = w * A[j + k + mid] % P;A[j + k] = (x + y) % P;A[j + k + mid] = (x - y + P) % P;}}}if (tp == -1) {LL inv = qpow(lim, P - 2);for (int i = 0; i < lim; ++i)A[i] = A[i] * inv % P;}
}int a, b, c, d, n, mn, mx;
LL fac[maxn], ifac[maxn];
LL ha[maxn << 3], hb[maxn << 3], hc[maxn << 3], hd[maxn << 3];
int r[maxn << 3];inline LL g(int i) {std::copy(ifac, ifac + a - i + 1, ha);std::copy(ifac, ifac + b - i + 1, hb);std::copy(ifac, ifac + c - i + 1, hc);std::copy(ifac, ifac + d - i + 1, hd);int lim = 1, l = 0;while (lim <= a + b + c + d - 4 * i) lim <<= 1, ++l;for (int j = 0; j < lim; ++j)r[j] = (r[j >> 1] >> 1) | ((j & 1) << (l - 1));ntt(ha, r, lim, 1);ntt(hb, r, lim, 1);ntt(hc, r, lim, 1);ntt(hd, r, lim, 1);for (int j = 0; j < lim; ++j)ha[j] = ha[j] * hb[j] % P * hc[j] % P * hd[j] % P;ntt(ha, r, lim, -1);LL ret = ha[n - 4 * i];std::fill(ha, ha + lim, 0);std::fill(hb, hb + lim, 0);std::fill(hc, hc + lim, 0);std::fill(hd, hd + lim, 0);return ret;
}int main() {read(n, a, b, c, d);mn = std::min({a, b, c, d, n / 4});mx = std::max({a, b, c, d, n});fac[0] = ifac[0] = 1;for (int i = 1; i <= mx; ++i)fac[i] = fac[i - 1] * i % P;ifac[mx] = qpow(fac[mx], P - 2);for (int i = mx - 1; i; --i)ifac[i] = ifac[i + 1] * (i + 1) % P;LL ans = 0;for (int i = 0; i <= mn; ++i) {LL sgn = i & 1 ? P - 1 : 1;LL res = sgn * fac[n - 3 * i] % P * ifac[i] % P * g(i) % P;ans = (ans + res) % P;}writeln((ans % P + P) % P);return 0;
}
[TJOI2019]唱、跳、rap和篮球 题解相关推荐
- 一个摄像头就能让虚拟人唱跳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日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...
- Vue第一部分(2): 数据的渲染
插值表达式 数据绑定最常见的形式就是使用 {{值}} (双大括号)的文本插值: <div id="app"><h1>{{msg}}</h1>&l ...
- Python多线程(自学必备 超详细)
多线程技术 多任务 1.1 多任务的概念 多任务:在同一时间内执行多个任务[可以把每个任务理解为生活当中的每个活] 1.2 现实生活中的多任务 操作系统可以同时运行多个任务.比如,你一边打游戏,一边和 ...
- 带你从Vue入门到进阶
系统学习前端Vue框架,笔记记录于B站的why老师,具体视频链接,在此感谢老师的悉心授课.我的github笔记地址 欢迎访问我的博客 My Blog: https://coderblue.cn/ Gi ...
- 当周杰伦把QQ音乐干翻的时候,作为程序猿我看到了什么?
点击蓝字关注我吧 1 别人都会唱了,而我还没付钱! 2019年9月16日晚23点整,周杰伦发布新歌<说好不哭>. 我经过一系列猛如虎的操作: 咦!这啥? 发生错误了?what the fu ...
最新文章
- 企业/团队如何实行绩效管理,促进团队智慧高效办事?
- 建立二叉树A【openjudge】
- Python练习 | 初识Python、数据类型、基本语句
- mysql 5.6开启binlog_docker快速入门02——在docker下开启mysql5.6 binlog日志
- UVALive - 3231 Fair Share(最大流+二分)
- Swoole入门指南:PHP7安装Swoole详细教程(一)
- 泡泡玛特上市首日涨79.22%报69港元 总市值953亿港元
- 众辰nz200变频器使用说明书_一些电工听到变频器有点懵,今天我们一起来分析变频咋回事?...
- 大数据可视化的应用场景
- hdu 4351 Digital root
- 把博客园自己博客皮肤改了下
- 红米5a android,红米5A值得买吗?红米5A测评告诉你(附全文)
- 股票交易软件排行及简介
- 推流至Wowza服务器要注意的问题
- JAVA中ResourceBundle使用详解
- SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了
- win7系统桌面上计算机不见了怎么办,win7桌面上我的电脑图标不见了怎么办
- 解决Chrome浏览器无法加载flash插件的问题
- java 经典算法(转)
- springboot结合Hikari连接池出现java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8F\x98\xEF\xB8...‘
热门文章
- [算法]代码运行时间增长数量级对比 线性级别N vs 线性对数级别 NlgN
- 单例模式,androidstudio简易app实例
- 【学习笔记】seckill-秒杀项目--(10)安全优化
- 【蓝牙sbc协议】sbc源码阅读笔记(二)——sbc_struct详解(上)
- 使用three.js创建一个正方体
- 计算机毕业设计php的网络投票在线投票系统
- 我的遥远的清平湾(插图版)读后感
- 超燃动态可视化条形图源码及效果图_HTML5大数据可视化效果(一)彩虹爆炸图...
- html页面加文字水印
- python爬虫100例--微博评论(5)