1383 杨梅阴谋

描述

【背景】

   2008.11.16

   3721大班在Mr Lv 的组织下,到六食堂举办了一次集体包饺子活动:)

   这次活动很成功,大家都很高兴,所谓“有缘千里,相聚北航”。

   下来后,某人根据这次活动出了一套练习题……

   ---------------------------------------------------------------------

包饺子活动怎么有杨梅?

是Mr.Lv出的主意吧……就是用可食用品“杨梅”替换了传统饺子中的彩头“硬币”罢了……

吃到杨梅一定是好事么?不一定了这次……

结局是这样的……

吃到杨梅的人排成一列抽取一个号码,1-9吧;

然后主持人宣布对于每个号码的亲亲“处理”办法;

最好的是直接去领取奖品;

然后有要回答问题才能领取奖品的;

还有惩罚喝醋,酱油的……

最恶毒的是……选择个人给像给女(男)朋友喂饺子一样喂他(她)吃,好像没有说一定要选择异性……

对于这个队列,处理过程还是一个处理,从队列的1号开始到N号;

现在的问题是:小X排在第M号,他知道礼品只有K个,他前面有两类人可能拿到奖品,如果抽取号码是1号,那么是100%可以得到个礼品(前提是还有礼品剩余),如果抽取号码是2号,回答问题,他假设那人有1/2的机会拿到奖品;其他号码没有奖品;

当然这条规则也适用与小X本人;

小X想知道他能拿到奖品的概率是多少,用分数形式表示;

输入

第一行包含一个整数T,表示有T组测试数据;

以下T组数据每组格式为:

第一行为3个整数N,M,K,意义如题目描述;

第二行为N个整数,每个整数范围为1~9;

保证N不大于147(为什么?guess),K不大于10;

输出

请以分数形式a/b输出答案,要求a与b互质(或者a为1,b为整数)

如果概率为0,那么就输出一个0即可;

样例输入
1
8 7 4
2 2 3 1 4 2 1 5
样例输出
7/8

此题主要的考察点就是概率和最小公倍数

#include <iostream>
#include <stdio.h>

using namespace std;

int fac(int a)
{
	int res = 1;
	int i;
	for(i = 2; i <= a; i ++)
		res *= i;
	return res;
}

int cal(int a, int b)
{
	int res = 1;
	int i;
	for(i = a; i > a-b; i --)
		res*=i;
	for(i = 2; i <= b; i ++)
		res/=i;
	return res;
}

int gcd(int a, int b)
{
	while(b!=0)
	{
		int temp = b;
		b = a%b;
		a = temp;
	}
	return a;
}
int main()
{
	int N, M, K;
	int t;
	scanf("%d", &t);
	while(t --)
	{
		scanf("%d%d%d", &N, &M, &K);
		int i;
		int a[151];
		for(i = 1; i <= N; i ++)
		{	
			scanf("%d", &a[i]);
		}
		int ones = 0;
		int twos = 0;
		for(i = 1; i < M; i ++)
		{
			if(a[i] == 1) 
			{	
				ones ++;
			}
			if(a[i] == 2)
			{
				twos ++;
			}
		}
		int remains = K-ones;
		if(remains <= 0 || a[M] > 2)
		{
			printf("0\n");
			continue;
		}
		if(remains > twos)
		{
			if(a[M]==1) printf("1/1\n");
			if(a[M]==2) printf("1/2\n");
			continue;
		}
		int x = 0; //分子
		for(i = 0; i < remains; i ++)
			x += cal(twos, i);
		int y = 1<<twos; // 分母
		int bp;
		if(a[M]==2) y = y*2;
		bp = gcd(y, x);
		y = y/bp;
		x = x/bp;
		printf("%d/%d\n", x, y);


	}
	return 0;
}


 

 

你可能感兴趣的:(1383 杨梅阴谋)