题目链接:点击查看

题目大意:给出一个n和m,要求我们构造出两个数组a和b,满足以下要求:

  1. 两个数组的长度都为m
  2. 每个元素的取值都为1~n
  3. 对于每一个位置都有a[i]<=b[i]
  4. 数组a非降序
  5. 数组b非升序

输出有多少种方案

题目分析:因为涉及到方案数了,所以不是dp就是组合数学,我看大佬们都用dp写的,奈何我不会dp,就只能用组合数学乱搞了

首先前置知识我们需要知道:

从n个数中任选m个数,这m个数从小到大排列,且可重复选取的方案数为C(n+m-1,m)

证明直接贴图片吧:

因为数组a非降序,而数组b非升序,又因为要满足a[i]<=b[i],我们可以知道两个数组之间的约束条件仅仅只由最后一位构成,只需要枚举最后一位就可以了,枚举最后一位时统计一下当数组a的最后一位数字为 i 时的答案,此时的答案肯定是利用上述已知公式计算出数组a的方案数乘以数组b的方案数了,记得去重,举个很简单的例子,因为1 1 1这个答案在 i 为1时已经计算过了,当 i 为2时,还是会重复计算1 1 1这个排列的,所以我们需要减去前面已经计算过的答案,具体实现看代码吧,我是先n*n的时间预处理出组合数,然后O(n)时间递推出答案的

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e3+100;const int mod=1e9+7;LL C[N][N];void init()
{for(int i=1;i<N;i++)for(int j=1;j<=i;j++){if(j==1)C[i][j]=i;elseC[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;init();scanf("%d%d",&n,&m);LL ans=0,pre=0;for(int i=1;i<=n;i++){ans=(ans+(C[i+m-1][m]-pre+mod)%mod*C[m+n-i][m])%mod;pre=C[i+m-1][m];}printf("%lld\n",ans);return 0;
}

CodeForces - 1288C Two Arrays(组合数学)相关推荐

  1. CodeForces - 1366E Two Arrays(组合数学+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a ,再给出一个长度为 m 的序列 b ,题目保证序列 b 是严格递增的,我们需要将 a 分割成恰好 m 段,使得每一段的最小值恰好等于 b[ ...

  2. [Codeforces 893E. Counting Arrays]排列组合

    [Codeforces 893E. Counting Arrays]排列组合 分类:combinatorics number theory math 1. 题目链接 [Codeforces 893E. ...

  3. Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aia_iai​,定义一个数组是好的当且仅当对于所有iii都有ai!=ia_i!=iai​!=i.定义f(a)f(a)f(a)表示数组aaa中i& ...

  4. CodeForces - 1312D Count the Arrays(组合数学)

    题目链接:点击查看 题目大意:给出一个 n 和 m ,求满足条件的数组有多少个 数组包含 n 个元素 每个元素的取值为 1 ~ m 包含且仅包含一对相同的元素 存在一个位置 pos ,使得 [ 1 , ...

  5. CodeForces - 1523E Crypto Lights(组合数学+推公式)

    题目链接:点击查看 题目大意:给出 nnn 个初始时熄灭的灯泡,每次操作会等概率打开一个灯泡,当每 kkk 个连续的灯泡中出现了大于一个亮着的灯泡时停止操作,问期望操作次数是多少 题目分析:组合数学题 ...

  6. Codeforces 396A 数论,组合数学

    题意:给一个a数组,求b 数组的方案数,但是要求两者乘积相同. 分析: 不可能将它们乘起来,对于每个数质因数分解,得到每个质因子个数,遍历这些质因子,将某个质因子放到 对应的盒子里面,可以不放,方案数 ...

  7. CodeForces - 1420D Rescue Nibel!(组合数学+离散化)

    题目链接:点击查看 题目大意:给出 n 盏灯,每盏灯在 [ l , r ] 这段时间内会保持点亮的状态,问恰好有 k 盏灯同时点亮,有多少种组合方式 题目分析:因为每盏灯都有一个开始亮的时间和一个熄灭 ...

  8. CodeForces - 1359E Modular Stability(组合数学)

    题目链接:点击查看 题目大意:给出一个 n 和 k ,要求构造一个长度为 k 的严格递增数组 a[ i ] ,且 1 <= a[ i ] <= n ,满足任意整数 x ,对下列的等式恒成立 ...

  9. CodeForces - 1267K Key Storage(组合数学)

    题目链接:点击查看 题目大意:给出一个正整数num,现在将其进行除以2.除以3.除以4....的操作,直到num变为0为止,期间记录每一次运算的余数,将其排序后得到一个集合,现在问有多少不同的数字经相 ...

最新文章

  1. linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
  2. JMH和Arthas定位问题的案例分享
  3. mongodb可视化工具连接报错
  4. hbase 数据库简介安装与常用命令的使用
  5. [文章集合] 在Windows Server 2012上关于Vmware的几点
  6. 摇滚吧HTML5!Jsonic超声波前端交互!
  7. 图像数据格式基础知识
  8. 新秀翻译(两)——使用Java通用配置模板方法模式
  9. ARCSDE的直接连接(SQLSERVER)
  10. ansible执行拷贝/脚本/任务计划/yum/service
  11. 用指针交换两个数_C语言100题集合026-使用指针交换两个数组中的最大值
  12. Hadoop学习之路(二十七)MapReduce的API使用(四)
  13. 计算机组成原理之输入输出设备
  14. 高校成绩管理数据库系统的设计与实现
  15. 游戏行业如何做防护?游戏被攻击怎么办?
  16. 信号处理中的反傅里叶变换(IFFT)原理
  17. Admin-UI分布式微服务监控中心
  18. cf修改游戏客户端是什么意思_cf封号原因是非法篡改游戏客户端是什么意思
  19. win8计算机的录音功能,win8电脑录音机功能在哪|win8录音功能使用方法
  20. vue安装postcss-pxtorem报错

热门文章

  1. MySQL高级 - 日志 - 错误日志
  2. SpringAMQP--入门案例的消息接收
  3. Spring用户自定义类型
  4. RabbitMQ死信实战(生产者)
  5. 循环尝试,不释放CPU
  6. 字节输入流一次读取多个字节
  7. SpringMVC异常处理之分析和搭建环境
  8. 最全的IDEA快捷键
  9. flyway版本号_数据库版本管理工具-flyway
  10. CAM350 10.7 中文界面