CodeForces - 1288C Two Arrays(组合数学)
题目链接:点击查看
题目大意:给出一个n和m,要求我们构造出两个数组a和b,满足以下要求:
- 两个数组的长度都为m
- 每个元素的取值都为1~n
- 对于每一个位置都有a[i]<=b[i]
- 数组a非降序
- 数组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(组合数学)相关推荐
- CodeForces - 1366E Two Arrays(组合数学+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列 a ,再给出一个长度为 m 的序列 b ,题目保证序列 b 是严格递增的,我们需要将 a 分割成恰好 m 段,使得每一段的最小值恰好等于 b[ ...
- [Codeforces 893E. Counting Arrays]排列组合
[Codeforces 893E. Counting Arrays]排列组合 分类:combinatorics number theory math 1. 题目链接 [Codeforces 893E. ...
- 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& ...
- CodeForces - 1312D Count the Arrays(组合数学)
题目链接:点击查看 题目大意:给出一个 n 和 m ,求满足条件的数组有多少个 数组包含 n 个元素 每个元素的取值为 1 ~ m 包含且仅包含一对相同的元素 存在一个位置 pos ,使得 [ 1 , ...
- CodeForces - 1523E Crypto Lights(组合数学+推公式)
题目链接:点击查看 题目大意:给出 nnn 个初始时熄灭的灯泡,每次操作会等概率打开一个灯泡,当每 kkk 个连续的灯泡中出现了大于一个亮着的灯泡时停止操作,问期望操作次数是多少 题目分析:组合数学题 ...
- Codeforces 396A 数论,组合数学
题意:给一个a数组,求b 数组的方案数,但是要求两者乘积相同. 分析: 不可能将它们乘起来,对于每个数质因数分解,得到每个质因子个数,遍历这些质因子,将某个质因子放到 对应的盒子里面,可以不放,方案数 ...
- CodeForces - 1420D Rescue Nibel!(组合数学+离散化)
题目链接:点击查看 题目大意:给出 n 盏灯,每盏灯在 [ l , r ] 这段时间内会保持点亮的状态,问恰好有 k 盏灯同时点亮,有多少种组合方式 题目分析:因为每盏灯都有一个开始亮的时间和一个熄灭 ...
- CodeForces - 1359E Modular Stability(组合数学)
题目链接:点击查看 题目大意:给出一个 n 和 k ,要求构造一个长度为 k 的严格递增数组 a[ i ] ,且 1 <= a[ i ] <= n ,满足任意整数 x ,对下列的等式恒成立 ...
- CodeForces - 1267K Key Storage(组合数学)
题目链接:点击查看 题目大意:给出一个正整数num,现在将其进行除以2.除以3.除以4....的操作,直到num变为0为止,期间记录每一次运算的余数,将其排序后得到一个集合,现在问有多少不同的数字经相 ...
最新文章
- linux mysql 5.7.12_Linux环境mysql5.7.12安装教程
- JMH和Arthas定位问题的案例分享
- mongodb可视化工具连接报错
- hbase 数据库简介安装与常用命令的使用
- [文章集合] 在Windows Server 2012上关于Vmware的几点
- 摇滚吧HTML5!Jsonic超声波前端交互!
- 图像数据格式基础知识
- 新秀翻译(两)——使用Java通用配置模板方法模式
- ARCSDE的直接连接(SQLSERVER)
- ansible执行拷贝/脚本/任务计划/yum/service
- 用指针交换两个数_C语言100题集合026-使用指针交换两个数组中的最大值
- Hadoop学习之路(二十七)MapReduce的API使用(四)
- 计算机组成原理之输入输出设备
- 高校成绩管理数据库系统的设计与实现
- 游戏行业如何做防护?游戏被攻击怎么办?
- 信号处理中的反傅里叶变换(IFFT)原理
- Admin-UI分布式微服务监控中心
- cf修改游戏客户端是什么意思_cf封号原因是非法篡改游戏客户端是什么意思
- win8计算机的录音功能,win8电脑录音机功能在哪|win8录音功能使用方法
- vue安装postcss-pxtorem报错