uva10375 Choose and Divide(唯一分解定理)
uva10375 Choose and Divide(唯一分解定理)
题意:
已知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位小数。
分析:
本题时间上基本上没有太大的限制,可以暴力求解C(m,n);
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int P, Q, R, S;
void solve()
{
int i, j, k;
double ans = 1.0;
if(P - Q < Q)
Q = P - Q;
if(R - S < S)
S = R - S;
for(i = ; i <= S || i <= Q; i ++)
{
if(i <= Q)
ans = ans * (P - Q + i) / i;
if(i <= S)
ans = ans / (R - S + i) * i;
}
printf("%.5lf\n", ans);
}
int main()
{
while(scanf("%d%d%d%d", &P, &Q, &R, &S) ==)
solve();
return ;
}
但是我们会发现当数据再大一些,就已超出了计算机整数的表示范围,所以本题
我们使用唯一分解定理进行求解,通过将其分解为指数幂次相乘的形式即可
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
const int MAXN=;
int prime[MAXN+];
int nprime;
void getPrime(){
int m=sqrt(MAXN+0.5);
memset(prime,,sizeof(prime));
for(int i=;i<=m;++i)if(!prime[i])
for(int j=i*i;j<=MAXN;j+=i) prime[j]=;
nprime=;
for(int i=;i<=MAXN;++i){
if(!prime[i])
prime[nprime++]=i;
}
}
int e[MAXN+];
void add_integer(int n,int d){
for(int i=;i<nprime;i++){
while(n%prime[i]==){
n/=prime[i];
e[i]+=d;
}
if(n==) break;
}
}
void add_factorial(int n,int d){
for(int i=;i<=n;i++)
add_integer(i,d);
}
int main(){
getPrime();
int p,q,r,s;
while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF){
memset(e,,sizeof(e));
add_factorial(p,);
add_factorial(q,-);
add_factorial(p-q,-);
add_factorial(r,-);
add_factorial(s,);
add_factorial(r-s,);
int maxn=max(p,r);
double ans=;
for(int i=;i<=maxn;i++){
ans*=pow(prime[i],e[i]);
}
printf("%.5lf\n",ans);
}
return ;
}
uva10375 Choose and Divide(唯一分解定理)的更多相关文章
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- uva10375 Choose and divide
唯一分解定理. 挨个记录下每个质数的指数. #include<cstdio> #include<algorithm> #include<cstring> #incl ...
- UVA10375 Choose and divide 质因数分解
质因数分解: Choose and divide Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %l ...
- Choose and divide(唯一分解定理)
首先说一下什么是唯一分解定理 唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积:例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1< ...
- UVA 10375 Choose and divide【唯一分解定理】
题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...
- UVA10375 选择与除法 Choose and divide 题解
题目链接: https://www.luogu.org/problemnew/show/UVA10375 分析: 这道题可以用唯一分解定理来做. 什么是唯一分解定理?百度即可,这里也简介一下. 对于任 ...
- UVa10375:选择与除法(唯一分解定理)
The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...
- 【暑假】[数学]UVa 10375 Choose and divide
UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...
- 唯一分解定理(以Minimun Sum LCM UVa 10791为例)
唯一分解定理是指任何正整数都可以分解为一些素数的幂之积,即任意正整数n=a1^p1*a2^p2*...*ai^pi:其中ai为任意素数,pi为任意整数. 题意是输入整数n,求至少2个整数,使得它们的最 ...
随机推荐
- [Machine Learning & Algorithm] 决策树与迭代决策树(GBDT)
谈完数据结构中的树(详情见参照之前博文<数据结构中各种树>),我们来谈一谈机器学习算法中的各种树形算法,包括ID3.C4.5.CART以及基于集成思想的树模型Random Forest和G ...
- 数位dp模板
#include <bits/stdc++.h> typedef long long LL; const int MOD = (int)1e9 + 7; LL L,R,G,T; int d ...
- Qt StyleSheet皮肤css源码
使用方式如下 //设置皮肤样式 static void SetStyle(const QString &styleName) { QFile file(QString(":/imag ...
- Servlet 之 HttpServlet
package cn.jiemoxiaodi.http; import java.io.IOException; import javax.servlet.GenericServlet; import ...
- js颠倒数组元素顺序reverse()
颠倒数组元素顺序reverse() reverse() 方法用于颠倒数组中元素的顺序. 语法: arrayObject.reverse() 注意:该方法会改变原来的数组,而不会创建新的数组. 定义数组 ...
- PHP 基础(赋值及函数)
开端<?php>结尾</php> 弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号 储存文件按 统一放到 安装文件夹下面的 WA ...
- 网络编程之socket
网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...
- js 定时器
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Windows无法安装到GPT分区的磁盘的解决方法
thinkpad 预装win8的机子,硬盘采用gpt分区,在重新安装其它系统的时候是无法安装的,会提示“windows无法安装到这个磁盘,选中的磁盘采用GPT分区 形式".所以先采用下面的方 ...
- SQL语句汇总
1.查询出来数据保留小数点2位,并且0.01时候,不会展示为.01. select to_char(0.1,'fm9999999990.00') from dual; 2.wm_concat ...