原题传送门

这题zsy写的是\(O(n^2)\),还有NTT\(O(n^2\log n)\)的做法。我的是暴力,\(O(\frac{a b n}{4})\),足够通过

考虑设\(f(i)\)表示序列中至少有\(i\)组人讨论cxk的方案数

这样就珂以进行容斥,易知答案ans为:

$$ans=\sum_{i=0}^{Min(n/4,a,b,c,d)} (-1)^i f(i)$$

我们考虑如何计算\(f(i)\)

如果视讨论cxk的组为一个元素,则一共有\(n-3*i\)个元素

我们把问题转换成一个多重排列的方案数

多重排列的方案数求法:

现在有\(m\)个不同的元素,每个\(i\)元素有\(a_i\)个,那么方案数为

$$(\sum_{i=1}^m a_i)! \times \prod_{i=1}^m \frac{1}{a_i!}$$

那么我们只要暴力计算即可

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define N 2005
  4. #define mod 998244353
  5. #define getchar nc
  6. using namespace std;
  7. inline char nc(){
  8. static char buf[100000],*p1=buf,*p2=buf;
  9. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  10. }
  11. inline int read()
  12. {
  13. register int x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  16. return x*f;
  17. }
  18. inline void write(register int x)
  19. {
  20. if(!x)putchar('0');if(x<0)x=-x,putchar('-');
  21. static int sta[20];register int tot=0;
  22. while(x)sta[tot++]=x%10,x/=10;
  23. while(tot)putchar(sta[--tot]+48);
  24. }
  25. inline int Min(register int a,register int b)
  26. {
  27. return a<b?a:b;
  28. }
  29. int n,a,b,c,d,lim;
  30. ll fac[N],inv[N],f[N],res,ans;
  31. int main()
  32. {
  33. n=read(),a=read(),b=read(),c=read(),d=read();
  34. fac[0]=fac[1]=inv[0]=inv[1]=1;
  35. for(register int i=2;i<=n;++i)
  36. fac[i]=fac[i-1]*i%mod;
  37. for(register int i=2;i<=n;++i)
  38. inv[i]=(mod-mod/i)*inv[mod%i]%mod;
  39. for(register int i=2;i<=n;++i)
  40. inv[i]=inv[i]*inv[i-1]%mod;
  41. lim=Min(n>>2,Min(Min(a,b),Min(c,d)));
  42. for(register int x=0,v;x<=lim;++x)
  43. {
  44. v=(x&1)?-1:1;
  45. for(register int i=0;i<=n;++i)
  46. f[i]=0;
  47. for(register int i=0;i<=a-x;++i)
  48. for(register int j=0;j<=Min(n-4*x-i,b-x);++j)
  49. f[i+j]=(f[i+j]+inv[i]*inv[j])%mod;
  50. res=0;
  51. for(register int i=0;i<=c-x;++i)
  52. for(register int j=0;j<=Min(n-4*x-i,d-x);++j)
  53. res=(res+inv[i]*inv[j]%mod*f[n-4*x-i-j])%mod;
  54. res=res*fac[n-3*x]%mod*inv[x]%mod;
  55. ans=(ans+v*res)%mod;
  56. }
  57. write(ans<0?ans+mod:ans);
  58. return 0;
  59. }

【题解】Luogu P5339 [TJOI2019]唱、跳、rap和篮球的更多相关文章

  1. Luogu P5339 [TJOI2019]唱、跳、rap和篮球

    题目 设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数. 那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^ ...

  2. [bzoj5510]唱跳rap和篮球

    显然答案可以理解为有(不是仅有)0对情况-1对情况+2对情况-- 考虑这个怎么计算,先计算这t对情况的位置,有c(n-3t,t)种情况(可以理解为将这4个点缩为1个,然后再从中选t个位置),然后相当于 ...

  3. p5339 [TJOI2019]唱、跳、rap和篮球

    分析  代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ; ],inv[],G,cc[][] ...

  4. 将Android手机无线连接到Ubuntu实现唱跳Rap

    您想要将Android设备连接到Ubuntu以传输文件.查看Android通知.以及从Ubuntu桌面发送短信 – 你会怎么做?将文件从手机传输到PC时不要打电话给自己:使用GSConnect就可以. ...

  5. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt

    [TJOI2019]唱.跳.rap和篮球 这么多人过没人写题解啊 那我就随便说说了嗷 这题第一步挺套路的,就是题目要求不能存在balabala的时候考虑正难则反,要求必须存在的方案数然后用总数减,往往 ...

  6. 「TJOI2019」唱、跳、rap 和篮球 题解

    题意就不用讲了吧-- 鸡你太美!!! 题意: 有 \(4\) 种喜好不同的人,分别最爱唱.跳. \(rap\).篮球,他们个数分别为 \(A,B,C,D\) ,现从他们中挑选出 \(n\) 个人并进行 ...

  7. [TJOI2019]唱、跳、rap和篮球——NTT+生成函数+容斥

    题目链接: [TJOI2019]唱.跳.rap和篮球 直接求不好求,我们考虑容斥,求出至少有$i$个聚集区间的方案数$ans_{i}$,那么最终答案就是$\sum\limits_{i=0}^{n}(- ...

  8. [luogu5339] [TJOI2019]唱、跳、rap和篮球(容斥原理+组合数学)(不用NTT)

    [luogu5339] [TJOI2019]唱.跳.rap和篮球(容斥原理+组合数学)(不用NTT) 题面 略 分析 首先考虑容斥,求出有i堆人讨论的方案. 可以用捆绑法,把每堆4个人捆绑成一组,其他 ...

  9. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

随机推荐

  1. 【CF1142B】Lynyrd Skynyrd

    [CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...

  2. 「BJOI2018」治疗之雨

    传送门 Description 有\(m+1\)个数,第一个数为\(p\),每轮:选一个数\(+1\),再依次选\(k\)个数\(-1\) 要求如果第一个数\(=N\),不能选它\(+1\),如果第一 ...

  3. 向量召回 vearch

    开源向量召回工具 https://github.com/vearch/vearch 架构

  4. Delphi XE7并行编程: 并行For循环

    从Delphi XE7开始,引入了全新的并行编程库用于简化并行编程,它位于System.Threading单元中. 下面是一个判断素数的简单例子:function IsPrime (N: Intege ...

  5. MySQL:实现cumsum(累加)的功能

    需求:为实现cumsum累计求和的功能. 一张视图. SELECT 日期, 净利润 FROM daily_pnl_view; 现在希望得到,每天累计的利润是多少. SET @csum := 0;SEL ...

  6. numpy的文件存储.npy .npz 文件详解

    Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...

  7. jquery ajax Uncaught TypeError :Illegal invocation 报错

    使用jquery ajax异步提交的时候报Uncaught TypeError :Illegal invocation错误,报错如图: 基本上,导致这个错误的原因一般有以下两点: 1.请求类型有误,如 ...

  8. git push ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/Operater9/guest' hint: Updates were rejected because the tip of your current bra

    推送本地代码到github报错 git push报错 ! [rejected] master -> master (non-fast-forward) error: failed to push ...

  9. 2019年计算机技术与软件专业技术资格(水平)考试安排v

    根据<关于2019年度专业技术人员资格考试计划及有关问题的通知>(人社厅发[2018]142号)要求,2019年度计算机技术与软件专业技术资格(水平)考试(以下简称计算机软件资格考试)安排 ...

  10. WordtoPdfUtil word转pdf

    jar: <dependency> <groupId>com.jacob</groupId> <artifactId>jacob</artifac ...