计数

Time Limit: 1000 ms Memory Limit: 256 MB

description

img


吐槽

所以说。。组合数的题是不是都是知道大致思路但是就是不会写qwq菜醒qwq

正题

这题其实感觉有点玄妙啊,自己想的话总是会想复杂。。但其实情况还是很好考虑的重点在于怎么枚举

首先讲一下大致思路

总共有4中不同的字符,相邻两个不能相同,那么我们可以考虑两种字符的排列(也就是先考虑\(A\)\(B\)怎么放和\(C\)\(D\)怎么放),然后再把\(AB\)的放法和\(CD\)的放法用插空的方式组合起来求得最后的答案

因为处理起来其实是一样的所以这里就只写\(AB\)的情况了

AB的情况

\(A\)\(B\)有四种最基本的满足要求的摆放:

(1)\(A\) (2)\(B\) (3)\(AB\) (4)\(BA\)

我们枚举这些字符总共组成了多少个区间(这里的区间指的是在最后合并插空之后这段字符还是连在一起的,也就是说没有\(C\)\(D\)插在中间),设总共有\(i\)个区间

我们再枚举一下(1)的个数,这时会发现每多一个(1)类区间,\(A\)的总数就会比\(B\)多一个,每多一个(2)类区间\(A\)就会比\(B\)少一个,而(3)和(4)的话不会对差有任何影响。

由于\(A\)的个数和\(B\)的个数是固定的,也就是说\(A\)\(B\)的差是固定的,(1)的个数一旦确定,为了保证\(A\)\(B\)的差满足条件,(2)的个数也就确定下来了。

我们记(1)类区间的个数为\(a\),那么(2)类区间的个数就是\(b = n1-n2+a\)

接着再看(3)和(4),会发现其实这两类本质上是一样的,我们只用枚举一类然后乘上组合数(其实就是\(2^i\),因为每一位可以是\(A\)或者\(B\)),这样我们就可以把这两类看做一类了,这剩下的一类的区间总数就是\(c=i - a -b\)

接下来看怎么算排列

首先对于(1)类和(2)类,我们用掉\(a\)\(A\)\(b\)\(B\),排列的方案数显然是$C_{i}^{a} $ * \(C_{i-a}^{b}\)

对于剩下的(3)和(4),我们还有\(n1+n2-a-b\)个字符可以使用,也就是总共有\(d=\frac{n1+n2-a-b}{2}\)\(AB\)

\(d\)对字符首先要放进\(c\)个区间中(那么显然这里就要求\(d>=c\)了,在枚举的时候要注意范围),如果还有剩余,再将剩余的\(d-c\)对分配到\(i\)个区间中,那么方案就是\(C_{i+d-c+1}^{i-1}\)
为什么是这个东西嘞?
其实问题就相当于求\(i\)个非负数之和=\(d-c\)的方案数,我们先在等式两边都加上\(i\),然后变成\(i\)个正整数之和\(=i+d-c\),然后用隔板法就好了(枚举分割线在哪个空隙)。
这样操作是因为隔板法的使用前提是不能有空组(否则分割线的数量不一定是分成的份数-1),我们考虑将\(i+d-c\)分成i个数之后,每个数减去\(1\),得到i个非负整数(可以为0),此时这\(i\)个非负整数的和就是\(d-c\)了,也就是说这就是我们要求的其中一种方案,其他的情况同理,一一对应,所以这两个问题在组合数中是等价的

我们用\(f1\)来表示组成\(i\)个区间的方案数,那么就可以得到:

\(f1_i =\sum\limits_{a=0}^{n1+n2}C_{i}^{a}×C_{i-a}^{b}×2^c×C_{i+d-c+1}^{i-1}\)

用同样的方式来算\(C\)\(D\)的方案,存到\(f2\)里面去

接下来看插空

插空有三种插法,下面用(AB)表示\(A\)\(B\)组成的一个区间,(CD)表示\(C\)\(D\)组成的一个区间,三种方法就可以这样表示:

1.(AB)(CD)(AB)(CD)(AB)

2.(CD)(AB)(CD)(AB)(CD)

3.(AB)(CD)(AB)(CD)(AB)(CD)(或者(AB)和(CD)的顺序反过来,所以算的时候要×2)

(其实会发现就是之前分别算\(AB\)区间和\(CD\)区间的三大类)

那么\(ans\)应该就是
\[ ans=\sum\limits_{i=1}^{n1+n2} f1_i*f2_{i-1}+f1_{i}*f2_{i+1}+f1_{i}*f2_{i}*2 \]
然后就十分愉快滴做完啦ovo

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define MOD 1000000007
using namespace std;
const int MAXN=4010;
ll f1[MAXN],f2[MAXN],two[MAXN],C[MAXN][MAXN];
ll ans;
int n1,n2,n3,n4;
int get_c(int n);
int get_f(int num1,int num2,ll *f);
ll calc(int c,int d);

int main(){
#ifndef ONLINE_JUDGE
    freopen("a.in","r",stdin);
#endif
    scanf("%d%d%d%d",&n1,&n2,&n3,&n4);
    two[0]=1;
    int sum=n1+n2+n3+n4;
    for (int i=1;i<=sum;++i) two[i]=(two[i-1]<<1)%MOD;
    get_c(sum);
    get_f(n1,n2,f1);
    get_f(n3,n4,f2);
    for (int i=1;i<=n1+n2;++i)
        ans=(ans+f1[i]*f2[i-1]%MOD+f1[i]*f2[i+1]%MOD+2LL*f1[i]*f2[i]%MOD)%MOD;
    printf("%lld\n",ans);
}

int get_c(int n){
    for (int i=0;i<=n;++i){
        C[i][0]=1; C[i][i]=1;
        for (int j=1;j<i;++j)
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
    }   
}

int get_f(int num1,int num2,ll *f){
    int a,b,c,d,sum=num1+num2;
    for (int i=0;i<=num1+num2;++i){
        for (a=0;a<=i;++a){//枚举(1)
            b=num1-num2+a;//(2)
            c=i-a-b;//(3)+(4)要填区间
            d=(sum-a-b)/2;//(3)+(4)可用对
            if (b<0||c<0||d<0||d<c) continue;
            f[i]=(f[i]+C[i][a]*C[i-a][b]%MOD*two[c]%MOD*calc(i,d-c)%MOD)%MOD;
        }   
    }
}

ll calc(int c,int d){//c个非负整数之和=d,枚举所有区间填了一个之后剩下的放哪里
    if (!c) return d==0;
    return C[c+d-1][c-1];
}

转载于:https://www.cnblogs.com/yoyoball/p/8268966.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需求。
标题基于SpringBoot的学生学习成果管理平台研究AI更换标题第1章引言介绍研究背景、目的、意义以及论文结构。1.1研究背景与目的阐述学生学习成果管理的重要性及SpringBoot技术的优势。1.2研究意义分析该平台对学生、教师及教育机构的意义。1.3论文方法与结构简要介绍论文的研究方法和整体结构。第2章相关理论与技术概述SpringBoot框架、学习成果管理理论及相关技术。2.1SpringBoot框架简介介绍SpringBoot的基本概念、特点及应用领域。2.2学习成果管理理论基础阐述学习成果管理的核心理论和发展趋势。2.3相关技术分析分析平台开发所涉及的关键技术,如数据库、前端技术等。第3章平台需求分析与设计详细分析平台需求,并设计整体架构及功能模块。3.1需求分析从学生、教师、管理员等角度对平台需求进行深入分析。3.2整体架构设计设计平台的整体架构,包括技术架构和逻辑架构。3.3功能模块设计具体设计平台的核心功能模块,如成果展示、数据分析等。第4章平台实现与测试阐述平台的实现过程,并进行功能测试与性能分析。4.1平台实现详细介绍平台的开发环境、关键代码实现及技术难点解决方案。4.2功能测试对平台各项功能进行全面测试,确保功能正确无误。4.3性能分析分析平台的性能指标,如响应时间、并发处理能力等。第5章平台应用与效果评估探讨平台在实际教学中的应用,并对其效果进行评估。5.1平台应用案例选取典型应用案例,展示平台在实际教学中的使用情况。5.2效果评估方法介绍平台效果评估的具体方法和指标。5.3评估结果分析根据评估数据,对平台的应用效果进行深入分析。第6章结论与展望总结论文的主要研究成果,并指出未来研究方向。6.1研究结论概括性地阐述论文的研究结论和主要贡献。6.2研究展望针对当前研究的不足之处,提出未来改进和扩展的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值