例题10-3 选择与除法 UVa10375

1.题目描述:点击打开链接

2.解题思路:本题让计算两个组合数的商,既可以直接利用公式,也可以利用唯一分解定理:事先计算10000以内的所有素数,然后计算组合数分解后各个素数的幂,用数组e保存指数即可。这里计算指数时可以利用数论中求n!分解式中各个素因数指数的公式。

3.代码:

(利用唯一分解定理)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;
#define maxn 10000+10
int vis[maxn];
int e[maxn];
vector<int>primes;
void init()//计算10000以内的素数
{
	int m = sqrt(maxn + 0.5);
	for (int i = 2; i <= m; i++)
	if (!vis[i])
	for (int j = i*i; j <= 10000; j += i)
		vis[j] = 1;
	for (int i = 2; i <= 10000; i++)
	if (!vis[i])
		primes.push_back(i);
}

void add_factorial(int n, int d)//计算指数并添加到数组e
{
	int tmp = n;
	for (int i = 0; i < primes.size(); i++)
	{
		if (n / primes[i] == 0)break;
		int sum = 0;
		int x = primes[i];
		while (n / x>0)
		{
			sum += n / x;
			x = x*primes[i];
		}
		if (d == 1)
			e[i] += sum;
		else
			e[i] -= sum;
	}
}

int main()
{
	//freopen("test.txt", "r", stdin);
	int p, q, r, s;
	init();
	while (cin >> p >> q >> r >> s)
	{
		memset(e, 0, sizeof(e));
		add_factorial(p, 1);
		add_factorial(q, -1);
		add_factorial(p - q, -1);
		add_factorial(r, -1);
		add_factorial(s, 1);
		add_factorial(r - s, 1);
		double ans = 1;
		for (int i = 0; i < primes.size(); i++)
			ans *= pow(primes[i] , e[i]);
		printf("%.5lf\n", ans);
	}
	return 0;
}

(利用公式直接计算)

#include <cstdio>
#include <algorithm>

using namespace std;

int main () {

	int p, q, r, s;
	while (scanf ("%d%d%d%d", &p, &q, &r, &s) != EOF) {

		q = min (q, p - q);
		s = min (s, r - s);

		double ans = 1.0;
		for (int i = 1; i <= q || i <= s; i++) {
			if (i <= q)
				ans = ans * (p - i + 1) / i;
			if (i <= s)
				ans = ans * i / (r - i + 1);
		}
		printf ("%.5lf\n", ans);
	}
	return 0;
}
时间: 2024-11-08 14:34:05

例题10-3 选择与除法 UVa10375的相关文章

刘汝佳 例题10-3 选择与除法

1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<vector> 5 #include<iostream> 6 using namespace std; 7 8 const int maxn = 10000; 9 vector<int> primes; 10 int e[maxn]; 11 12 /** 13 add_factorial(int n,

【UVA10375】选择与除法

题意 英文题真的杀千刀 真不好意思说我是某知名外国语学校的毕业生 已知C(m,n)=m! / (n!*(m-n!)),输入整数p,q,r,s(p>=q,r>=s,p,q,r,s<=10000),计算C(p,q)/C(r,s).输出保证不超过10^8,保留5位小数 分析 网上怎么全是唯一分解定理?阶乘不就可以约分越掉一大堆吗,上面剩下p~p-q+1下面剩下q~1或者上面剩下p~p-(p-q)+1下面剩下(p-q)~1 选一个小的就直接一个一个除了累起来就好了吧?需要注意的是,求C(p,q)

DuiVision开发教程(10)-皮肤选择窗口

DuiVision界面库支持定义窗口的背景皮肤,如果某个窗口未指定特殊的背景皮肤,则会使用全局的背景皮肤,通过界面库提供的皮肤窗口可以更改界面皮肤,皮肤窗口如下: 通过皮肤窗口可以将背景皮肤更换为默认的9张图片之一,或者是选择的某种颜色,或者选择一个自定义的图片背景. 皮肤选择窗口的定义文件是dlg_skin.xml,如果想修改皮肤窗口的界面,可以修改这个文件,默认的9张背景图片是放在exe所在路径的bkimg子目录下,图片资源名是SKIN_PIC_0-SKIN_PIC_8,图片文件名分别是SK

10、选择框:ion-select

!重点 multiple="true" 控制 选择框是 多选还是单选.true为 多选类似 checkbox. /* ---html----*/ <ion-content padding> <ion-list> <ion-item> <ion-label>单选</ion-label> <ion-select [(ngModel)]="gaming"> <ion-option value=&

UVA 10375 选择与除法

一看四个整数的范围,<=10000  所以我们肯定不能直接打表求阶乘 利用唯一分解定理(任何一个大于1的正整数都能够被唯一地分解成质因子乘积) #include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<vec

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn

10道ACM例题让你三天学会STL

清明节给大一的孩子们讲了点STL的应用,下了些功夫,搬到这里来供大家学习交流. 1.泛型程序设计简介与迭代器的介绍 2.常见的STL容器及其例题应用(UVA10474,UVA101,UVA10815,UVA156,UVA540,UVA136 HDU1027,CF501B,HDU1716,HDU4277) 3.相关练习和思路 1.泛型程序设计简介与迭代器的介绍 1.1 泛型程序设计简介 泛型程序设计,简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,

用选择法对10个整数按从小到大排序(数组)

用选择法对10个整数按从小到大排序,要求使用数组. 算法思想: 第一次选择:从10个整数中挑出其中最小的整数,拿出来: 第二次选择:从余下的9个整数中挑出其中最小的整数,拿出来,放到上一次挑出的数的后面: 第三次选择:从余下的8个整数中挑出其中最小的整数,拿出来,放到上一次挑出的数的后面: ---- 以此类推,直到全部挑完. #include "stdafx.h" #include<iostream> using namespace std; int _tmain(int

css那些事儿1 css选择符与管理

结合当下作为一名net程序员,难以找到工作情况下,先学习前端知识,前端现在已成为web和app的一个交叉点,web前端化,app使用h5技术前端化,至于什么后台数据库 缓存 消息队列的路线如果没有大型项目平台的建设机会是很难能够大纵深的切入,恰恰前端通过编写微信公众号作为一个切入点,希望不会再也找不到工作,再也无法跳巢的尴尬境地. 1 css语法 选择符{属性:value}css的语法非常简单. 2 css常见简写 color:#ffffff ;color:rgb(255,255,255);rg