传送门

老年退役选手来写题解了

题意

有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&lt;aj+1a_j+3&lt;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&lt;a2−3&lt;a3−6&lt;⋯&lt;aj−3(j−1)≤n−3i1\leq a_1&lt;a_2-3&lt;a_3-6&lt;\cdots&lt;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−i​j!xj​)(j=0∑b−i​j!xj​)(j=0∑c−i​j!xj​)(j=0∑d−i​j!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(nlog⁡n)O(n\log n)O(nlogn),总复杂度O(n2log⁡n)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和篮球 题解相关推荐

  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. Vue第一部分(2): 数据的渲染

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

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

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

  9. 带你从Vue入门到进阶

    系统学习前端Vue框架,笔记记录于B站的why老师,具体视频链接,在此感谢老师的悉心授课.我的github笔记地址 欢迎访问我的博客 My Blog: https://coderblue.cn/ Gi ...

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

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

最新文章

  1. 企业/团队如何实行绩效管理,促进团队智慧高效办事?
  2. 建立二叉树A【openjudge】
  3. Python练习 | 初识Python、数据类型、基本语句
  4. mysql 5.6开启binlog_docker快速入门02——在docker下开启mysql5.6 binlog日志
  5. UVALive - 3231 Fair Share(最大流+二分)
  6. Swoole入门指南:PHP7安装Swoole详细教程(一)
  7. 泡泡玛特上市首日涨79.22%报69港元 总市值953亿港元
  8. 众辰nz200变频器使用说明书_一些电工听到变频器有点懵,今天我们一起来分析变频咋回事?...
  9. 大数据可视化的应用场景
  10. hdu 4351 Digital root
  11. 把博客园自己博客皮肤改了下
  12. 红米5a android,红米5A值得买吗?红米5A测评告诉你(附全文)
  13. 股票交易软件排行及简介
  14. 推流至Wowza服务器要注意的问题
  15. JAVA中ResourceBundle使用详解
  16. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了
  17. win7系统桌面上计算机不见了怎么办,win7桌面上我的电脑图标不见了怎么办
  18. 解决Chrome浏览器无法加载flash插件的问题
  19. java 经典算法(转)
  20. springboot结合Hikari连接池出现java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8F\x98\xEF\xB8...‘

热门文章

  1. [算法]代码运行时间增长数量级对比 线性级别N vs 线性对数级别 NlgN
  2. 单例模式,androidstudio简易app实例
  3. 【学习笔记】seckill-秒杀项目--(10)安全优化
  4. 【蓝牙sbc协议】sbc源码阅读笔记(二)——sbc_struct详解(上)
  5. 使用three.js创建一个正方体
  6. 计算机毕业设计php的网络投票在线投票系统
  7. 我的遥远的清平湾(插图版)读后感
  8. 超燃动态可视化条形图源码及效果图_HTML5大数据可视化效果(一)彩虹爆炸图...
  9. html页面加文字水印
  10. python爬虫100例--微博评论(5)