hihoCoder#1698 : 假期计划 组合数
题解:
题目要求是有序的排列,因此我们可以在一开始就乘上A!*B!然后在把这个序列划分成很多段。
这样的话由于乘了阶乘,所以所有排列我们都已经统计到了,因为划分段的时候乘了组合数,所以每段里面的不同排列都已经统计到了,所以就可以解决这道题了。
主要难度在与平时我们计算方案时一般都是先划分,再乘阶乘,所以如果陷入这个误区就可能做不出来了。
所以我们先枚举中间那段有多长,然后乘一下阶乘和处理划分的组合数,最后再乘一下中间这段的第一个可以放在多少个位置。
因为左右两段都必须非空,所以左边要预留一位,所以第一个可以放的位置在2,同理,最后一个可以放的位置在n - i.减一下就可以得到可以放在n - i - 1个位置。
注意一下枚举的时候中间的天数最多n - 2,原因同上
$ans = A! \cdot B! \cdot \binom{A - 1}{n - i - 1} \cdot \binom{B - 1}{i - 1} \cdot (n - i - 1)$
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 101000
#define p 1000000009
#define LL long long LL A_ = , B_ = , A, B, t, all, ans;
LL C[][AC], inv[AC]; void cal(LL n, int x)
{
C[x][] = ;
for(R i = ; i <= t; i ++)
C[x][i] = C[x][i - ] * (n - i + ) % p * inv[i] % p;
} void pre()
{
scanf("%lld%lld%lld", &t, &A, &B);
inv[] = inv[] = ;
for(R i = ; i <= t; i ++) inv[i] = (p - p / i) * inv[p % i] % p;
for(R i = ; i <= A; i ++) A_ = A_ * i % p;
for(R i = ; i <= B; i ++) B_ = B_ * i % p;
cal(A - , ), cal(B - , );
all = A_ * B_ % p;
} void work()
{
int b = min(t - , B);
for(R i = ; i <= b; i ++)//枚举中间的天数
ans = (ans + all * C[][t - i - ] % p * C[][i - ] % p * (t - i - ) % p) % p;
printf("%lld\n", ans);
} int main()
{
freopen("in.in", "r", stdin);
pre();
work();
fclose(stdin);
return ;
}
hihoCoder#1698 : 假期计划 组合数的更多相关文章
- hihocoder #1698 假期计划 (排列组合+费马小定理+乘法逆元)
Description 小Ho未来有一个为期N天的假期,他计划在假期中看A部电影,刷B道编程题.为了劳逸结合,他决定先拿出若干天看电影,再拿出若干天刷题,最后再留若干天看电影.(若干代指大于0) 每 ...
- [No000016]为什么假期计划总是做不到?
- [USACO13DEC]假期计划(黄金)Vacation Planning (gold)
题目翻译不好,这里给出一份 题目背景 Awson是某国际学校信竞组的一只大佬.由于他太大佬了,于是干脆放弃了考前最后的集训,开车(他可是老司机)去度假.离开学校前,他打开地图,打算做些规划. 题目描述 ...
- poj1936 假期计划第一水
All in All Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29651 Accepted: 12312 Desc ...
- 洛谷P3094 [USACO13DEC]假期计划Vacation Planning
题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...
- c++ imooc自学计划
一.视频学习相关的课程列表: C++远征之起航篇http://www.imooc.com/learn/342: C++远征之离港篇http://www.imooc.com/learn/381: C++ ...
- [hihocoder][Offer收割]编程练习赛48
折线中点 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...
- JavaScript和jQuery的学习
还有12天就要回学校了,我的假期计划还能实现吗?在这12天里,需要把JavaScript和jQuery学完.我知道这两个技术对于前端网页开发非常重要.前期把HTML和CSS学完了,学的不是特别深,只是 ...
- [Offer收割]编程练习赛48
题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...
随机推荐
- 一 Hive安装及初体验
一 .Hive安装及初体验 1 .hive简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.1直接使用hadoop面临的问题 ...
- redis 问题记录
摘抄来自:https://zhuoroger.github.io/ 1.slowlog和排队延时 slowlog是排查性能问题关键监控指标.它是记录Redis queries运行时间超时特定阀值的系统 ...
- pip源设置 & pandas安装
pip的官方源python.pypi.org貌似被墙,换用国内安装源 网上的设置方法都是基于Unix的,Windows下的设置略麻烦. 更新..\Lib\site-packages\pip下的cmdo ...
- Python拼接字符串的7种方法
1.直接通过+操作: s = 'Python'+','+'你好'+'!'print(s) 打印结果: Python,你好! 2.通过join()方法拼接: 将列表转换成字符串 strlist=['Py ...
- WEB网站测试心得整理
一.输入框: 1.正常的字母/文字/数字(正常流程的测试): 2.重复提交(输入内容后,重复点击提交按钮): 3.纯异常字符/正常输入夹杂异常字符(!@#¥%……&**等等): 4.长度限制( ...
- 使用python+selenium控制手工已打开的浏览器
我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...
- Request对象及常用方法
Object getAttribute(String name) 获得name的属性,若不存在,则返回null Enumeration getAttributeNames() 返回一个枚举类型的包含r ...
- 【MySQL解惑笔记】忘记MySQL数据库密码
破解MySQL密码 一.MySQL5.7.5之前 只要有系统root密码就可以破解: [root@host- ~]# vim /etc/my.cnf //在配置文件中加入如下内容 [mysqld] s ...
- java.net.ProtocolException: Server redirected too many times
网页爬虫时,原来正常的代码,可能是因为网站做了cookie校验处理,报异常:java.net.ProtocolException: Server redirected too many times 表 ...
- HDU 2491 Priest John's Busiest Day(贪心)(2008 Asia Regional Beijing)
Description John is the only priest in his town. October 26th is the John's busiest day in a year be ...