loj3106「TJOI2019」唱、跳、rap 和篮球

大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观。
他的同学可以分为四类:一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢 rap,还有一部分最喜欢篮球。

如果队列中 k,k+1,k+2,k+3 位置上的同学依次,最喜欢唱、最喜欢跳、最喜欢 rap、最喜欢篮球,那么他们就会聚在一起讨论蔡徐坤。
大中锋不希望这种事情发生,因为这会使得队伍显得很乱。

大中锋想知道有多少种排队的方法,不会有学生聚在一起讨论蔡徐坤。
两个学生队伍被认为是不同的,当且仅当两个队伍中至少有一个位置上的学生的喜好不同。
由于合法的队伍可能会有很多种,种类数对 998244353 取模。


Sol

生成函数??


我们考虑容斥。
枚举有 i 对讨论的。
答案即 (1)i×C(n3i,i)×[便]
可以理解为把四个人压成一个人然后再组合。
考虑怎么算剩下的人的方案。
假设剩下n人要排,每种还剩a,b,c,d个。
aC(n,a)bC(na,b)cC(nab,c)
剩下的给d
这个是n3的。
我们枚举AB用了r个,C则D用了nr个。

r=0nC(n,r)i=max(0,rb)min(a,r)C(r,i)i=max(0,nrd)min(c,nr)C(nr,i)
这就是n2的了。

 

复制代码
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define mod 998244353
#define ll long long
#define maxn 1005
using namespace std;
int N,A,B,C,D; 
ll z[maxn][maxn],s[maxn][maxn],ans;
void init(){
    N=1000;
    for(int i=0;i<=N;i++){
        z[i][0]=s[i][0]=1;
        for(int j=1;j<=i;j++){
            z[i][j]=(z[i-1][j]+z[i-1][j-1])%mod;
            s[i][j]=(s[i][j-1]+z[i][j])%mod;
        }
    }
}
ll CC(int n,int m){
    return z[n][m];
}
ll Sum(int n,int l,int r){
    if(l>r)return 0;
    return s[n][r]-s[n][l-1];
}
ll get(int n,int a,int b,int c,int d){
    if(a<0||b<0||c<0||d<0)return 0;
    ll sum=0,s1,s2;
    for(int r=0;r<=n&&r<=a+b;r++){
        s1=Sum(r,max(0,r-b),min(a,r));
        s2=Sum(n-r,max(0,n-r-d),min(c,n-r));
        sum=(sum+CC(n,r)*s1%mod*s2%mod)%mod;
    }
    return sum;
}
int main(){
    init();
    scanf("%d%d%d%d%d",&N,&A,&B,&C,&D);
    A=min(A,N);B=min(B,N);C=min(C,N),D=min(D,N);
    for(int i=0;i*4<=N;i++){
        ll t=CC(N-3*i,i)*get(N-4*i,A-i,B-i,C-i,D-i)%mod;
        if(i&1)ans=ans-t;
        else ans=ans+t;
        ans%=mod;
    }
    ans=(ans+mod)%mod;
    cout<<ans<<endl;
    return 0;
}
View Code
复制代码

 

posted @   liankewei123456  阅读(189)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示