light oj 1095 - Arrange the Numbers排列组合(错排列)
Consider this sequence {1, 2, 3 ... N}, as an initial sequence of first N natural numbers. You can rearrange this sequence in many ways. There will be a total of N! arrangements. You have to calculate the number of arrangement of first N natural numbers, where in first M positions; exactly K numbers are in their initial position.
For Example, N = 5, M = 3, K = 2
You should count this arrangement {1, 4, 3, 2, 5}, here in first 3 positions 1 is in 1st position and 3 in 3rd position. So exactly 2 of its first 3 are in there initial position.
But you should not count {1, 2, 3, 4, 5}.
Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.
Each case contains three integers N (1 ≤ N ≤ 1000), M (M ≤ N), K (0 < K ≤ M).
Output
For each case, print the case number and the total number of possible arrangements modulo 1000000007.
Sample Input |
Output for Sample Input |
|
2 5 3 2 10 6 3 |
Case 1: 12 Case 2: 64320 |
分析:先从m个数中选出k个数待在自己位置上(c(m, k)), 然后在剩下n-k个数中,有n-m个数可以待在自己原来的位置上,故每局n-m个数有多少个数在自己原来的位置上,剩下的 n - k - i 个数 就是一个错排列了。
(错排列 : D[i] = (i-1) * (D[i-1] + D[i-2] ) ; )
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 1100
#define INF 0x3f3f3f3f
#define mod 1000000007
long long c[N][N], d[N];
void init()///组合数c(n, m)的的值存在c数组中。
{
c[0][0] = 1;
for(int i = 1; i < N; i++)
{
c[i][0] = c[i][i] = 1;
for(int j = 1; j < i; j++)
{
c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod;
}
}
d[1] = 0;
d[2] = d[0] = 1;
for(int i = 3; i < N; i++)
d[i] = (i-1) * (d[i-1] + d[i-2]) % mod;///错排列 : D[i] = (i-1) * (D[i-1] + D[i-2] )
}
long long solve(int n, int m, int k)
{
long long ans = 0;
for(int i = 0; i <= n - m; i++)///i表示在n-m数中选i个数呆在自己原来的位置。
ans = (ans + (c[n-m][i] * d[n-k-i]) % mod) % mod;///c[n-m][i] * d[n-k-i]表示在n-m数中选i个数呆在自己原来的位置,剩下n-k-i都不呆在自己位上的数错排列得到的排列数。
return ans * c[m][k] % mod;
}
int main()
{
int T, cas;
int n, m, k;
scanf("%d", &T);
cas = 0;
init();
while(T--)
{
cas++;
scanf("%d%d%d", &n, &m, &k);
long long ans = solve(n, m, k);
printf("Case %d: %lld\n", cas, ans);
}
return 0;
}
light oj 1095 - Arrange the Numbers排列组合(错排列)的更多相关文章
- Light oj 1095 - Arrange the Numbers (组合数学+递推)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题意: 给你包含1~n的排列,初始位置1,2,3...,n,问你刚好固定 ...
- Light OJ 1095 Arrange the Numbers(容斥)
给定n,m,k,要求在n的全排列中,前m个数字中恰好有k个位置不变,有几种方案?首先,前m个中k个不变,那就是C(m,k),然后利用容斥原理可得 ans=ΣC(m,k)*(-1)^i*C(m-k,i) ...
- Light OJ 1095
题意: 给你 N 个数, 总共有 N! 种排列, 现在 要你统计前 M 个数 刚好 有K 个数 在原来的位置上 的排列个数 思路: 首先 M 中选 K C(m,k): 则 共 剩下 n - k 个数, ...
- lightoj 1095 - Arrange the Numbers(dp+组合数)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题解:其实是一道简单的组合数只要推导一下错排就行了.在这里就推导一下错排 ...
- LightOJ - 1095 - Arrange the Numbers(错排)
链接: https://vjudge.net/problem/LightOJ-1095 题意: Consider this sequence {1, 2, 3 ... N}, as an initia ...
- light oj 1095 组合数学
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- DataFactory使用和注意,排列组合
DataFactory使用和注意 mysql 连接ODBC开放数据库连接(Open Database Connectivity,ODBC)驱动程序 生成数据:int不能用 Build a compos ...
- 自然语言处理(NLP) - 数学基础(1) - 排列组合
正如我在<自然语言处理(NLP) - 数学基础(1) - 总述>一文中所提到的NLP所关联的概率论(Probability Theory)知识点是如此的多, 饭只能一口一口地吃了, 我们先 ...
- Java蓝桥杯——排列组合
排列组合介绍 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序. 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序. 全排列(permutation) 以数字为例,全 ...
随机推荐
- oracle的一些简单语法
1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...
- day6 相对定位:position:relative
相对定位:position:relative 特点:a.相对于自己原来位置的定位,以自己的左上角为基准. b.相对定位原来的位置仍然算位置,不会出现浮动现象. 以下为初始位置:(可以看出设置margi ...
- kubernetes concepts -- Replication Controller
Edit This Page ReplicationController NOTE: A Deployment that configures a ReplicaSet is now the reco ...
- 使用使用django-cors-headers解决跨域问题
安装 pip3 install -i https://pypi.douban.com/simple django-cors-headers 注册App INSTALLED_APPS = [ ... ' ...
- AntV F2 数据可视化填坑,图表横向滚动
柱状图横向滚动 思路 通过 Interaction 实现平移,通过 ScrollBar 显示滚动条 1.Interaction F2 提供一套交互机制,以达到通用交互行为的封装和复用.基于此机制,我们 ...
- .NET Core微服务一:Consul服务中心
本文的项目代码,在文章结尾处可以下载. 防爬虫,本文的网址是:https://www.cnblogs.com/shousiji/p/12253295.html 本文使用的环境:Windows10 64 ...
- PBR原理
漫反射和镜面反射 漫反射和镜面反射(或反射)光是描述光和材料之间两种主要相互作用类型的两个术语.镜面光是指从表面反弹的光.在光滑的表面上,这种光将反射所有相同的方向,并且表面将呈现镜像.漫射光是被吸收 ...
- 2018CCPC吉林赛区(重现赛)部分题解
The Fool 题目链接 Problem Description The Fool is numbered 0 – the number of unlimited potential –and th ...
- 关于基本布局之——Flex布局
Flex布局 1.Flex为"Flexible Box"的简称,即为弹性布局,可作用于任何容器上.给div这类块状元素元素设置display:flex或者给span这类内联元素设置 ...
- RabbitMq 深入了解
积少成多 ---- 仅以此致敬和我一样在慢慢前进的人儿 问题一:什么是RabbitMq 下面就是些个人的感受, rabbitmq 就是一个遵循AMQP协议(这个是啥不清楚) 的消息队列的实现,用于服 ...