题目:

学生分为四种,要么喜欢唱,要么喜欢跳,要么喜欢rap,要么喜欢篮球,每个学生有且只能喜欢一种,现在从中选nnn个学生排成一排,求排列数,满足不存在位置kkk,使kkk的喜欢唱,k+1k+1k+1的喜欢跳,k+2k+2k+2的喜欢rap(这样的凑在一起会鸡你太美),k+3k+3k+3的喜欢篮球,两个排列不同当且仅当存在对应位置两个学生喜欢的不一样。

(1≤n≤1000,1≤a,b,c,d≤500)(1 \le n \le 1000,1 \le a,b,c,d \le 500)(1≤n≤1000,1≤a,b,c,d≤500)

题解:

求这种不存在某种情况的排列数,用钦定法。

令fkf_kfk​为存在kkk个鸡你太美的排列数,令gkg_kgk​为钦定kkk个鸡你太美,其他位置任意的排列数,那么有

gk=∑i=klim(ik)fi\displaystyle g_k=\sum_{i=k}^{lim}\dbinom{i}{k}f_igk​=i=k∑lim​(ki​)fi​,其中lim=min⁡{n4,a,b,c,d}\displaystyle lim=\min\{\frac{n}{4},a,b,c,d\}lim=min{4n​,a,b,c,d}。

二项式反演可得

fk=∑i=klim(−1)i−k(ik)gi\displaystyle f_k=\sum_{i=k}^{lim} (-1)^{i-k}\dbinom{i}{k}g_ifk​=i=k∑lim​(−1)i−k(ki​)gi​

答案为f0=∑i=0lim(−1)igi\displaystyle f_0=\sum_{i=0}^{lim} (-1)^ig_if0​=i=0∑lim​(−1)igi​

考虑gkg_kgk​怎么计算,找出kkk个鸡你太美相当于找kkk个起始位置,这kkk个位置至少相隔4,那么相当于在n−3kn-3kn−3k个位置里找kkk个位置,然后再从这kkk的位置的后面延伸出3个位置还原到nnn个位置。其他位置任意,按题目的意思喜欢相同东西的学生算相同的,所以相当于用4种颜色去涂若干个位置的排列数,这就是EGFEGFEGF的经典问题了,令ha,b,c,d,nh_{a,b,c,d,n}ha,b,c,d,n​为四种颜色分别有a,b,c,da,b,c,da,b,c,d去涂nnn个位置的排列数,写出四种颜色的EGFEGFEGF,以第一种颜色为例,为Aa(x)=∑i=0axii!\displaystyle A_a(x)=\sum_{i=0}^a\frac{x^i}{i!}Aa​(x)=i=0∑a​i!xi​,其他的也类似,然后将四个EGFEGFEGF卷起来即可,但是这样每次需要NTTNTTNTT,复杂度为O(n2logn)O(n^2logn)O(n2logn),足以通过本题,但还可以优化。

将gkg_kgk​的表达式代入f0f_0f0​的式子可得

f0=∑i=0lim(−1)i(n−3kk)ha−i,b−i,c−i,d−i,n−4i\displaystyle f_0=\sum_{i=0}^{lim} (-1)^i\dbinom{n-3k}{k}h_{a-i,b-i,c-i,d-i,n-4i}f0​=i=0∑lim​(−1)i(kn−3k​)ha−i,b−i,c−i,d−i,n−4i​

从大到小枚举iii,那么相当于每次都会使4个EGFEGFEGF多一项,考虑分别维护第一种颜色和第二种颜色的EGFEGFEGF多项式乘法,第三种颜色和第四种颜色的EGFEGFEGF多项式乘法,以前者为例,原先已经算出了Aa×BaA_a\times B_aAa​×Ba​,现在要算Aa+1×Bb+1A_{a+1}\times B_{b+1}Aa+1​×Bb+1​,那么有Aa+1×Bb+1=(Aa+xa+1(a+1)!)(Bb+xb+1(b+1)!)=AaBb+xb+1(b+1)!Aa+xa+1(a+1)!Bb+xa+b+2(a+1)!(b+1)!\displaystyle A_{a+1}\times B_{b+1}=(A_a+\frac{x^{a+1}}{(a+1)!})(B_b+\frac{x^{b+1}}{(b+1)!})=A_aB_b+\frac{x^{b+1}}{(b+1)!}A_a+\frac{x^{a+1}}{(a+1)!}B_b+\frac{x^{a+b+2}}{(a+1)!(b+1)!}Aa+1​×Bb+1​=(Aa​+(a+1)!xa+1​)(Bb​+(b+1)!xb+1​)=Aa​Bb​+(b+1)!xb+1​Aa​+(a+1)!xa+1​Bb​+(a+1)!(b+1)!xa+b+2​

第一项已经算出来了,第二项和第三项O(n)O(n)O(n)即可,第四项O(1)O(1)O(1)

最后要求卷积的n−4in-4in−4i项的系数,枚举一个多项式的项数,O(1)O(1)O(1)即可得到另一个多项式的对应项,所以也可O(n)O(n)O(n)求得,总复杂度为O(n2)O(n^2)O(n2)。

复杂度:O(n2)O(n^2)O(n2)

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<bitset>
#include<sstream>
#include<ctime>
//#include<chrono>
//#include<random>
//#include<unordered_map>
using namespace std;#define ll long long
#define ls o<<1
#define rs o<<1|1
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
const double pi=acos(-1.0);
const double eps=1e-6;
const int mod=998244353;
const int INF=0x3f3f3f3f;
const int maxn=1e6+5;
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,a,b,c,d;
ll fac[maxn],ifac[maxn],f[maxn],g[maxn];
ll qpow(ll a,ll p=mod-2){ll res=1;while(p){if(p&1)res=res*a%mod;a=a*a%mod;p>>=1;}return res;
}
void init(int n){fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;ifac[n]=qpow(fac[n]);for(int i=n-1;i>=0;i--)ifac[i]=ifac[i+1]*(i+1)%mod;
}
ll C(int n,int m){if(n<m)return 0;return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int main(void){// freopen("in.txt","r",stdin);init(1000000);scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);int lim=min(n/4,min(a,min(b,min(c,d))));for(int i=0;i<=a-lim;i++){for(int j=0;j<=b-lim;j++){(f[i+j]+=ifac[i]*ifac[j]%mod)%=mod;}}for(int i=0;i<=c-lim;i++){for(int j=0;j<=d-lim;j++){(g[i+j]+=ifac[i]*ifac[j]%mod)%=mod;}}ll ans=0;for(int i=lim;i>=0;i--){int tot=n-4*i;ll tmp=0;for(int j=0;j<=tot;j++){(tmp+=f[j]*g[tot-j]%mod)%=mod;}tmp=tmp*fac[tot]%mod;(ans+=(i%2?mod-1:1)*C(n-3*i,i)%mod*tmp%mod)%=mod;int na=a-i+1,nb=b-i+1,nc=c-i+1,nd=d-i+1;for(int j=0;j<=a-i;j++){(f[j+nb]+=ifac[j]*ifac[nb]%mod)%=mod;}for(int j=0;j<=b-i;j++){(f[j+na]+=ifac[j]*ifac[na]%mod)%=mod;}(f[na+nb]+=ifac[na]*ifac[nb]%mod)%=mod;for(int j=0;j<=c-i;j++){(g[j+nd]+=ifac[j]*ifac[nd]%mod)%=mod;}for(int j=0;j<=d-i;j++){(g[j+nc]+=ifac[j]*ifac[nc]%mod)%=mod;}(g[nc+nd]+=ifac[nc]*ifac[nd]%mod)%=mod;}printf("%lld\n",ans);return 0;
}

P5339 [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. vim配置python开发环境_VIM插件管理及python开发环境配置
  2. 开启Linux下Telnet服务
  3. 自定义SpringBoot的运行动画---美女
  4. 信息学奥赛C++语言:上课的人数
  5. C#LeetCode刷题之#933-最近的请求次数(Number of Recent Calls)
  6. linux awk 管道,shell使用管道,配合awk,一句代码清空大于设定大小的日志文件
  7. ERP 系统数据库设计规范
  8. UVALive 2523 Machine Schedule(二分图求最大匹配数)
  9. 写在自己工作六年:转载《软件工程师六年心得体会》
  10. 图片旋转_系统自带画图程序,图片旋转翻转调整大小修改转换格式图文教程
  11. MVVM 架构解析及 Jetpack 架构组件的使用
  12. retinex算法原理
  13. 为什么我从 Google 辞职而为自己工作
  14. caj文件打不开显示内存不足_CAJ文件打不开怎么办?
  15. Python字符串转义符大全
  16. 什么服务器操作系统更好?四大流派有这些!
  17. 【JavaScript】为什么是script error.
  18. 观影坪-纪录片之《穹顶之下》
  19. 西部数据移动硬盘设置密码教程
  20. 汉罗塔问题和杨辉三角(java实现)

热门文章

  1. 《内向性格的竞争力:发挥你的本来优势》读书笔记
  2. Android简易天气App
  3. SpringBoot多模块项目如何扫描全局mapper接口和mapper.xml文件
  4. 【问题解决】seckill-秒杀项目 -- 服务端异常
  5. 工业访问控制行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  6. Excel 实现 平均数±标准差
  7. python泰勒公式_泰勒展开式利用python数值方法证明
  8. c语言csp字符串,骇人听闻的 CSP
  9. 赵小楼《天道》《遥远的救世主》深度解析(90)谈经论道说心安
  10. 如何查看当前计算机硬盘状态,win7系统下如何查看硬盘状态