Luogu P5339 [TJOI2019]唱、跳、rap和篮球
题目
设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数。
那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^i{n-3i\choose i}f_i\)。
考虑一下这个\(f\),它就是四个指数型生成函数卷起来\((\sum\limits_{i=0}^a\frac{x^i}{i!})(\sum\limits_{i=0}^b\frac{x^i}{i!})(\sum\limits_{i=0}^c\frac{x^i}{i!})(\sum\limits_{i=0}^d\frac{x^i}{i!})\)。
\(f_i\)就是\(x^i\)的系数乘上\((n-4i)!\)。
我们考虑分成两半,前面是\((\sum\limits_{i=0}^a\frac{x^i}{i!})(\sum\limits_{i=0}^b\frac{x^i}{i!})\),后面是\((\sum\limits_{i=0}^c\frac{x^i}{i!})(\sum\limits_{i=0}^d\frac{x^i}{i!})\)。
每次修改相当于\(a,b,c,d\)都减一,这样子修改是\(O(n)\)的。求某一位的值可以直接暴力卷,也是\(O(n)\)的。
所以就做到了\(O(n^2)\)。
#include<bits/stdc++.h>
using namespace std;
const int N=1007,P=998244353;
int n,a,b,c,d,inv[N],fac[N],ifac[N],f[N],g[N];
void inc(int &a,int b){a+=b,a=a>=P? a-P:a;}
void dec(int &a,int b){a-=b,a=a<0? a+P:a;}
int mul(int a,int b){return 1ll*a*b%P;}
int C(int n,int m){return mul(mul(fac[n],ifac[m]),ifac[n-m]);}
void mns(int n,int m,int *f)
{
for(int i=0;i<=n;++i) dec(f[i+m],mul(ifac[i],ifac[m]));
for(int i=0;i<m;++i) dec(f[i+n],mul(ifac[i],ifac[n]));
}
int cal(int n)
{
int s=0;
for(int i=0;i<=n;++i) inc(s,mul(f[i],g[n-i]));
return mul(s,fac[n]);
}
int main()
{
cin>>n>>a>>b>>c>>d;int i,j,ans=0,x;
for(inv[1]=1,i=2;i<N;++i) inv[i]=mul(P-P/i,inv[P%i]);
for(fac[0]=ifac[0]=i=1;i<N;++i) fac[i]=mul(fac[i-1],i),ifac[i]=mul(ifac[i-1],inv[i]);
for(i=0;i<=a;++i) for(j=0;j<=b;++j) inc(f[i+j],mul(ifac[i],ifac[j]));
for(i=0;i<=c;++i) for(j=0;j<=d;++j) inc(g[i+j],mul(ifac[i],ifac[j]));
ans=cal(n);
for(i=1;i*4<=n&&a&&b&&c&&d;++i,--a,--b,--c,--d) mns(a,b,f),mns(c,d,g),x=mul(cal(n-i*4),C(n-i*3,i)),i&1? dec(ans,x):inc(ans,x);
printf("%d",ans);
}
Luogu P5339 [TJOI2019]唱、跳、rap和篮球的更多相关文章
- 【题解】Luogu P5339 [TJOI2019]唱、跳、rap和篮球
原题传送门 这题zsy写的是\(O(n^2)\),还有NTT\(O(n^2\log n)\)的做法.我的是暴力,\(O(\frac{a b n}{4})\),足够通过 考虑设\(f(i)\)表示序列中 ...
- [bzoj5510]唱跳rap和篮球
显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...
- p5339 [TJOI2019]唱、跳、rap和篮球
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ; ],inv[],G,cc[][] ...
- 将Android手机无线连接到Ubuntu实现唱跳Rap
您想要将Android设备连接到Ubuntu以传输文件.查看Android通知.以及从Ubuntu桌面发送短信 – 你会怎么做?将文件从手机传输到PC时不要打电话给自己:使用GSConnect就可以. ...
- [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt
[TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...
- [TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥
题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(- ...
- [luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)
[luogu5339] [TJOI2019]唱.跳.rap和篮球(容斥原理+组合数学)(不用NTT) 题面 略 分析 首先考虑容斥,求出有i堆人讨论的方案. 可以用捆绑法,把每堆4个人捆绑成一组,其他 ...
- 「TJOI2019」唱、跳、rap 和篮球 题解
题意就不用讲了吧-- 鸡你太美!!! 题意: 有 \(4\) 种喜好不同的人,分别最爱唱.跳. \(rap\).篮球,他们个数分别为 \(A,B,C,D\) ,现从他们中挑选出 \(n\) 个人并进行 ...
- [TJOI2019]唱,跳,rap,篮球(生成函数,组合数学,NTT)
算是补了个万年大坑了吧. 根据 wwj 的题解(最准确),设一个方案 \(S\)(不一定合法)的鸡你太美组数为 \(w(S)\). 答案就是 \(\sum\limits_{S}[w(S)=0]\). ...
随机推荐
- jvm——class类文件的结构
class类文件并不一定以磁盘的形式存在,也可以是由类加载器直接生成的二进制流,他其实是一种数据结构,类似于c语言结构体,这种数据结构只有两种数据类型:无符号数和表. 1.魔数:类似于文件拓展名,CA ...
- 【leetcode】Valid Parenthesis String
题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...
- Linux下lazarus交叉编译 win32[win64]
环境 vmvare + deepin Linux64 + lazarus2.0.6 参考:https://wiki.freepascal.org/Cross_compiling_for_Win32_u ...
- jquery扩展方法(表单数据格式化为json对象)
1.jquery扩展方法(表单数据格式化为json对象) <script type="text/javascript"> // 将表单数据序列化为一个json对象,例如 ...
- formData和input的file结合使用
<form method="POST" id="uploadForm" enctype="multipart/form-data"&g ...
- jconsole性能监控
1.进入tomcat bin目录 vim catalina.sh #!/bin/sh下面加入: #!/bin/shJAVA_OPTS="-Dcom.sun.management.jmxrem ...
- 测试相关shell命令总结2——结构控制语句,命令行参数
1,shell 中单引号和双引号的区别,单引号不进行解释.双引号进行解释 1,在shell中进行数学运算,放在$和[]中 $[1+2] 有些很奇怪,在.sh文件中放在(())中貌似也能够进行数学运算. ...
- 2018-2019-2 20165235《网络对抗技术》Exp8 Web基础
2018-2019-2 20165235<网络对抗技术>Exp8 Web基础 实践过程记录: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与 ...
- C语言的AES加密
C语言的AES加密 稍微封装了几个函数 方便使用 #if 1 #include <stdio.h> #include <stdlib.h> #include <strin ...
- leetcode-easy-array-283 move zeros
mycode 77.24% class Solution(object): def moveZeroes(self, nums): """ :type nums: Li ...