Light oj 1095 - Arrange the Numbers (组合数学+递推)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095
题意:
给你包含1~n的排列,初始位置1,2,3...,n,问你刚好固定前m个数中的k个数的位置,问你有多少中排列方案。(比如5 3 2有1 4 3 2 5这种方案,1和3固定了)
思路:
前m个取k个就是C(m, k)个方案。然后就是类似错排的思想,设dp[i]为i个数在初始位置各不相同。其中的组合数用逆元算出。
ans = dp[m - k] * C(n - m, 0) + dp[m - k + 1] * C(n - m, 1) .. dp[n - k] * C(n - m, n - m),这个式子表示取后面n-m个数的某些数 与 前面的m - k个数形成错排,剩下的数位置不变。
最后就是ans * C(m, k)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mod = 1e9 + , dp[];
LL f[];
LL fpow(LL a, LL n) {
LL ans = ;
while(n) {
if(n & )
ans = ans * a % mod;
a = a * a % mod;
n >>= ;
}
return ans;
}
int main()
{
dp[] = ;
dp[] = , dp[] = ;
f[] = f[] = , f[] = ;
for(LL i = ; i <= ; ++i) {
dp[i] = (dp[i - ] + dp[i - ]) % mod * (LL)(i - ) % mod;
f[i] = f[i - ] * (LL)i % mod;
}
int n, m, k, t;
scanf("%d", &t);
for(int ca = ; ca <= t; ++ca) {
scanf("%d %d %d", &n, &m, &k);
if(n == m && m - k == ) {
printf("Case %d: 0\n", ca);
continue;
}
LL ans = f[m] * fpow(f[k]*f[m - k]%mod, mod - ) % mod;
int temp = m - k, temp2 = n - m;
LL res = ;
for(int i = temp; i <= temp2 + temp; ++i) {
res = (res + dp[i] * f[temp2] % mod * fpow(f[i - temp]*f[temp2 - i + temp] % mod, mod - ) % mod) % mod;
}
printf("Case %d: %lld\n", ca, ans * res % mod);
}
return ;
}
Light oj 1095 - Arrange the Numbers (组合数学+递推)的更多相关文章
- light oj 1095 - Arrange the Numbers排列组合(错排列)
1095 - Arrange the Numbers Consider this sequence {1, 2, 3 ... N}, as an initial sequence of first 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) ...
- LightOJ - 1095 - Arrange the Numbers(错排)
链接: https://vjudge.net/problem/LightOJ-1095 题意: Consider this sequence {1, 2, 3 ... N}, as an initia ...
- UVA 11481 Arrange the Numbers(组合数学 错位排序)
题意:长度为n的序列,前m位恰好k位正确排序,求方法数 前m位选k个数正确排,为cm[m][k],剩余m - k个空位,要错排,这m - k个数可能是前m个数中剩下的,也可能来自后面的n - m个数 ...
- 【NOIP2016】组合数问题 题解(组合数学+递推)
题目链接 题目大意:给定$n,m,k$,求满足$k|C_i^j$的$C_i^j$的个数.$(0\leq i\leq n,1\leq j\leq \min(i,m))$. --------------- ...
- light oj 1095 组合数学
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> ...
- lightoj 1095 - Arrange the Numbers(dp+组合数)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题解:其实是一道简单的组合数只要推导一下错排就行了.在这里就推导一下错排 ...
- Light OJ 1095
题意: 给你 N 个数, 总共有 N! 种排列, 现在 要你统计前 M 个数 刚好 有K 个数 在原来的位置上 的排列个数 思路: 首先 M 中选 K C(m,k): 则 共 剩下 n - k 个数, ...
- UVa 11481 Arrange the Numbers (组合数学)
题意:给定 n,m,k,问你在 1 ~ n 的排列中,前 m 个恰好有 k 个不在自己位置的排列有多少个. 析:枚举 m+1 ~ n 中有多少个恰好在自己位置,这个是C(n-m, i),然后前面选出 ...
随机推荐
- 源码级强力分析hadoop的RPC机制
分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...
- 15,scrapy中selenium的应用
引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生如果直接用scrapy对其url发请求,是获取不到那部分动态加载出来的数据值,但是通过观察会发现,通过浏览器 ...
- nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R
用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chi ...
- loj2092 「ZJOI2016」大森林
ref不是太懂-- #include <algorithm> #include <iostream> #include <cstring> #include < ...
- MongoDB快速入门学习笔记1 windows安装MongoDB
1.安装MongoDB 从MongoDB官网上下载MongoDB,我下载的版本是64位的3.2.6.下载完以后直接安装,我的安装目录是D:\work\MongoDB. 2.配置MongoDB的环境变量 ...
- Python 模块搜索路径
Python 会在什么地方寻找文件来导入模块? 使用命名为 path 变量的存储在标准 sys 模块 下的一系列目录名和 ZIP 压缩文件. 你可以读取和修改这个列表.下面是在我的 Mac 上 Pyt ...
- 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra
题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...
- java.net.BindException: Permission denied
端口号报错: 解决办法:把端口号改为1000以上的,比如8080
- a:active在ios上无效解决方法
原因: By default, Safari Mobile does not use the :active state unless there is a touchstart event hand ...
- 查找String中出现最多字符的次数和个数
Sting 的charAt方法返回相应位置的字符,使用该方法遍历String,将每个字符存入对象属性,遍历属性得到最多字符个数 <!DOCTYPE html> <html> & ...