UVA10375 选择与除法 Choose and divide 题解
题目链接:
https://www.luogu.org/problemnew/show/UVA10375
分析:
这道题可以用唯一分解定理来做。
什么是唯一分解定理?百度即可,这里也简介一下。
对于任意一个自然数,都可以写成一些素数的幂次相乘的结果
比如说,26=13∗226=13*226=13∗2,30=2∗3∗530=2*3*530=2∗3∗5.
然后说详细做法:
首先make一个素数表prime,具体怎么做呢?
先用一个模板筛出合数:
for(int i=2;i<=100;i++)
{
if(vis[i]!=1)
for(int j=i*i;j<=10000;j+=i)
vis[j]=1;
}
反正蒟蒻孤陋寡闻,这已经是我知道最快的造表法了
弄出了合数,我们再把每一个素数记到一个vector里
for(int i=2;i<=10000;i++)
{
if(vis[i]==0)
{
prime.push_back(i);
}
}
这样为了之后循环幂次方便(一次完成,胜造多组数据)
之后就套公式
C(m,n)=n!(m−n)!m!C(m,n)=^{m!}_{n!(m-n)!}C(m,n)=n!(m−n)!m!
(中间的除号被吞了
用唯一分解来表示每个数,方便约分,因为此题的实质就是解决越界问题。
EndEndEnd
代码:
#include<cstdio>
#include<cmath>
#include<vector>
#include<cstring>
using namespace std;
int vis[10005];
vector<int>prime;
int e[10005];
void search(int n,int d)
{
for(int i=0;i<prime.size();i++)
{
while(n%prime[i]==0)
{
n=n/prime[i];
e[i]+=d;
}
if(n==1)break;
}
}
void pd(int n,int d)
{
for(int i=1;i<=n;i++)
{
search(i,d);
}
}
int main()
{
for(int i=2;i<=100;i++)
{
if(vis[i]!=1)
for(int j=i*i;j<=10000;j+=i)
vis[j]=1;
}
for(int i=2;i<=10000;i++)
{
if(vis[i]==0)
{
prime.push_back(i);
}
}
int p,q,r,s;
while(scanf("%d%d%d%d",&p,&q,&r,&s)==4)
{
memset(e,0,sizeof(e));
pd(p,1);
pd(q,-1);
pd(p-q,-1);
pd(r,-1);
pd(s,1);
pd(r-s,1);
double ans=1;
for(int i=0;i<prime.size();i++)
{
ans*=pow(prime[i],e[i]);
}
printf("%.5lf\n",ans);
}
return 0;
}
UVA10375 选择与除法 Choose and divide 题解的更多相关文章
- 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 ...
- UVA10375 Choose and divide 质因数分解
质因数分解: Choose and divide Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %l ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 【暑假】[数学]UVa 10375 Choose and divide
UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...
- UVa10375:选择与除法(唯一分解定理)
The binomial coefficient C(m,n) is defined as Given four natural numbers p, q, r, and s, compute the th ...
- uva10375 Choose and divide
唯一分解定理. 挨个记录下每个质数的指数. #include<cstdio> #include<algorithm> #include<cstring> #incl ...
- Choose and divide(唯一分解定理)
首先说一下什么是唯一分解定理 唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积:例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1< ...
- 【JSP 标签】选择判断c:choose
在JSP页面中对 根据一个属性的多个可能的值进行相应的输出 <%@ page language="java" contentType="text/html; cha ...
- UVa 10375 选择与除法(唯一分解定理)
https://vjudge.net/problem/UVA-10375 题意: 输入整数p,q,r,s,计算C(p,q)/C(r,s). 思路: 先打个素数表,然后用一个数组e来保存每个素数所对应的 ...
随机推荐
- 阿里Android开发手册正式版一览
新年伊始,春意盎然之际,阿里巴巴在2月28日再度为工程师们送上了一份重磅开春好礼:<阿里巴巴Android开发手册>. 该手册长达66页,是阿里巴巴集团各大 Android 开发团队的集体 ...
- Delphi&C#代码模拟“显示桌面”的功能(使用CreateOleObject('Shell.Application'))
今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是: ...
- 【Linux】linux中删除指定日期之前的文件
要删除系统中就的备份文件,就需要使用命令了: #find /tmp -mtime +30 -type f -name *.sh[ab] -exec rm -f {} \; 假如在一个目录中保留最近30 ...
- Flask学习之旅--数据库
一.写在前面 在Web开发中,数据库操作是很重要的一部分,因为网站的很多重要信息都保存在数据库之中.而Flask在默认情况下是没有数据库.表单验证等功能的,但是可以用Flask-extension为W ...
- SYN5301型 毫秒表时间检定仪
SYN5301型 毫秒表时间检定仪 频率记录仪时间记录仪时间频率信号的精密测量使用说明视频链接; http://www.syn029.com/h-pd-76-0_310_6_-1.html 请 ...
- kafka笔记6
我们讨论可靠性时,一般使用保证这个词,它是确保系统在各种不同的环境下能够发生一致的行为.Kafka可以在哪些方面作出保证呢? 1.Kafka可以保证分区消息的顺序 2.只有消息被写入分区的所有同步副本 ...
- spark streaming 接收kafka消息之一 -- 两种接收方式
源码分析的spark版本是1.6. 首先,先看一下 org.apache.spark.streaming.dstream.InputDStream 的 类说明: This is the abstrac ...
- Azkaban —— 编译及部署
一.Azkaban 源码编译 1.1 下载并解压 Azkaban 在3.0版本之后就不提供对应的安装包,需要自己下载源码进行编译. 下载所需版本的源码,Azkaban的源码托管在GitHub上,地址为 ...
- Java学习笔记——设计模式之七.模板方法模式
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...
- PATB 1041 考试座位号(15)
#include <cstdio> #include <iostream> using namespace std; struct student{ char str[15]; ...