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个整数,使得它们的最 ...
随机推荐
- R语言:用简单的文本处理方法优化我们的读书体验
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...
- NOSDK--一键打包的实现(三)
1.3 编译及拷贝资源的脚本介绍 这一节介绍编译及拷贝资源的shell脚本,即: tools: //保存通用的功 ...
- 数位dp模板
#include <bits/stdc++.h> typedef long long LL; const int MOD = (int)1e9 + 7; LL L,R,G,T; int d ...
- cookie中文乱码
在学习当中碰到cookie中文乱码问题,问题原因:cookie对中文不太支持,将中文放入cookie中会报错误. 解决办法: 1.编码 将中文进行编码再放入cookie中: String userna ...
- PHP Strom 配置less 并设置编译后在远程开发模式下自动上传css文件
ctrl+alt+s ->File Watchers->add-> 其中Argument中的-x代表最后编译过后的css文件为压缩过的 此时就可以用了,但是编译过后less可以自动上 ...
- 安装切换openjdk
安装各种版本openjdk sudo apt-get install openjdk-6-jdk sudo apt-get install openjdk-7-jdk sudo apt-get ins ...
- XHPROF相关内容
定义入口文件 define('XHPROF_OPEN', 0); define('XHPROF_ROOT', '/home/www/xhprof/'); // 开启调试模式 建议开发阶段开启 部署阶段 ...
- Deep Learning入门视频(上)_一层/两层神经网络code
关于在51CTO上的深度学习入门课程视频(9)中的code进行解释与总结: (1)单层神经网络: #coding:cp936 #建立单层神经网络,训练四个样本, import numpy as np ...
- iOS开发UI篇—CAlayer(创建图层)
iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...
- ping命令执行过程详解
[TOC] ping命令执行过程详解 机器A ping 机器B 同一网段 ping通知系统建立一个固定格式的ICMP请求数据包 ICMP协议打包这个数据包和机器B的IP地址转交给IP协议层(一组后台运 ...