UVALive 6909 Kevin's Problem 数学排列组合

Kevin's Problem

题目连接:

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4921

Description

In his applied probability class, Kevin learned about the Secretary Problem.
There are N applicants applying for secretary position in a company. The applicants are
interviewed by a hiring manager one by one in arbitrary order. During the interview, the
manager can rank the applicant’s quality uniquely relative to all applicants which have been
interviewed so far, but he has no idea of the quality of applicants yet to be interviewed.
The decision whether the manager should hire or reject the applicant must be done right
after the interview ended (before he starts an interview with other applicant) and cannot be
changed, i.e. once rejected, that particular applicant cannot be considered anymore. There
is only one position available, so what is the best decision strategy for this problem?
One reasonable strategy is: reject the first K applicants and hire the first remaining applicant who
is better than all previous interviewed applicants, or hire the last one if there is no such applicant.
Unfortunately, Kevin did not pay a full attention in his class. He misunderstood the strategy;
instead of “. . . hire the first remaining applicant who is better than all previous interviewed applicants
. . . ”, he thought it is “. . . hire the first remaining applicant who is better than the (immediate) previous
interviewed applicant . . . ”. Let’s call this variation as Kevin’s strategy.
Given N, K, and p determine in how many ways (interview order) such that the applicant whose
rank is p among all applicants will be selected by Kevin’s strategy. For example, let N = 4, K = 2,
and p = 2. Among all permutation of 1 . . . N, there are only 7 possible permutation such that the 2nd
rank applicant is selected by Kevin’s strategy.
• 1, 3, 2, 4 — 2 is selected because it’s better than 3.
• 1, 3, 4, 2 — 2 is selected because 4 is worse than 3, and 2 is better than 4.
• 1, 4, 2, 3
• 3, 1, 4, 2
• 3, 4, 2, 1
• 4, 1, 3, 2
• 4, 3, 2, 1
Note that the first 2 applicants will not be hired in this example (K = 2). Clearly, the 2nd rank
applicant will not be selected in any permutation where she appears in the first K.
An applicant has a better rank if her rank is higher (smaller number), e.g. 2nd rank is better than
5th.

Input

The first line of input contains an integer T (T ≤ 100) denoting the number of cases. Each case contains
three integers: N, K, and p (2 ≤ N ≤ 500; 1 ≤ K < N; 1 ≤ p ≤ N) as explained in the problem
description above.

Output

For each case, output ‘Case #X: Y ’, where X is the case number starts from 1 and Y is the number
of permutation of 1 . . . N such that the p-th rank applicants is selected by Kevin’s strategy for that
particular case. As this number could be very large, modulo Y by 1,000,000,007.
Explanation for 3rd sample case:
There are 5 applicants and Kevin’s strategy will reject the first 3. 5th rank applicant will be
selected only if she is interviewed last, thus the manager has no choice but to hire her. Among 24
possible permutations where 5th rank applicant appears last, only 12 permutations which make her
hired:
1, 2, 3, 4, 5 2, 1, 3, 4, 5 3, 1, 2, 4, 5 4, 1, 2, 3, 5
1, 3, 2, 4, 5 2, 3, 1, 4, 5 3, 2, 1, 4, 5 4, 2, 1, 3, 5
1, 4, 2, 3, 5 2, 4, 1, 3, 5 3, 4, 1, 2, 5 4, 3, 1, 2, 5
Some examples where 5th rank will not be hired even though she is the last:
1, 2, 4, 3, 5 – 3rd rank will be hired.
1, 4, 3, 2, 5 – 2nd rank will be hired.
3, 2, 4, 1, 5 – 1st rank will be hired.
. . .

Sample Input

4
4 2 2
5 2 3
5 3 5
8 4 2

Sample Output

Case #1: 7
Case #2: 26
Case #3: 12
Case #4: 7890

Hint

题意

有一个公司,有编号为1~n,也是他们能力排名的人来应聘。

公司准备只招一个人,他的招聘采用如下策略:

先排除前k个人,然后再看,如果这个人比前一个人厉害,那就录取。

如果没有人录取的话,那就录取最后一个人。

问你有n个人,现在k个人排除,录取能力为p的人的方案数有多少种。

题解:

数学题,前面k个我们不用管,然后到第p个人,那么第p个人前面的应该是一个能力递减编号递增的序列,然后剩下位置就全排列。

然后这样枚举p的位置,然后搞一波就好了。

代码

#include <bits/stdc++.h>
#define rep(a,b,c) for(int (a)=(b);(a)<=(c);++(a))
#define drep(a,b,c) for(int (a)=(b);(a)>=(c);--(a))
#define pb push_back
#define mp make_pair
#define sf scanf
#define pf printf
#define two(x) (1<<(x))
#define clr(x,y) memset((x),(y),sizeof((x)))
#define dbg(x) cout << #x << "=" << x << endl;
#define lowbit(x) ((x)&(-x))
const int mod = 1e9 + 7;
int mul(int x,int y){return 1LL*x*y%mod;}
int qpow(int x , int y){int res=1;while(y){if(y&1) res=mul(res,x) ; y>>=1 ; x=mul(x,x);} return res;}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
using namespace std;

inline void up(int & x ,int v){ x += v; if( x >= mod ) x -= mod; }
/*
dp(i , j , k , f)
已经放了 i 个 , 有 j 个比 p 小的已经放了, k -> 前面一个放的是谁 , f 表示 p 放了没有
*/

const int maxn = 500 + 15;
int N,K,P,C[maxn][maxn],fac[maxn];

void init(){
    fac[0] = 1;
	for(int i = 1 ; i < maxn ; ++ i) fac[i] = mul( fac[i - 1] , i );
	C[0][0] = 1;
	for(int i = 1 ; i < maxn ; ++ i){
		C[i][0] = 1;
		for(int j = 1 ; j <= i ; ++ j) up( C[i][j] ,  C[i - 1][j - 1] + C[i - 1][j] );
	}
}

int A(int n , int m){
	return mul( fac[n] , qpow( fac[n - m] , mod - 2 ) );
}


int main(int argc,char *argv[]){
	init();
	int T=read(),cas=0;
	while(T--){
		N=read(),K=read(),P=read();
		int ans = 0;
		up( ans , A( N - 1 , K - 1 ) );
		for(int i = K + 1 ; i < N ; ++ i){
			for(int j = P + 1 ; j <= N ; ++ j){
				if( j - 2 < 0 || j - 2 < i - K - 1 ) continue;
				int y = C[ j - 2 ][ i - K - 1 ];
				up( ans , mul( y , fac[N - i + K - 1] ) );
			}
		}
		pf("Case #%d: %d\n" , ++ cas , ans );
	}
	return 0;
}
posted @ 2016-08-03 18:52  qscqesze  阅读(435)  评论(0编辑  收藏  举报