首先说一下什么是唯一分解定理

唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积;例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1<p2<p3......

所以当我们求两个很大的数相除时  唯一分解定理是一个不错的选择,不会爆范围

下面具体说一下怎么求唯一分解定理:

首先我们需要知道所有的素数:  用埃式算法打表求得:

void is_prime()
{
cnt=;
for(int i=;i<=maxn;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i*;j<=maxn;j+=i) vis[j]=true;
}
}
}

接下来 就是求pi和ai了,

void solve(ll n,ll d)
{
for(int i=;i<cnt;i++)
{
while(n%prime[i]==)
{
n/=prime[i];
e[i]+=d;
}
if(n==) return ;
}
}

下面看一道例题:

题目链接:https://vjudge.net/problem/UVA-10375

题目大意:用C(p,q)/C(r,s)  最后结果保留5位小数

思路:这道题不用唯一分解定理就不好做了,阶层相乘很有可能会爆数据范围,总之挺麻烦的,但是用唯一分解定理跟快就能A了  很简单  看代码应该就能明白了

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long ll;
const int maxn=1e4+;
ll prime[maxn];
ll e[maxn];
bool vis[maxn];
ll cnt;
void is_prime()
{
cnt=;
for(int i=;i<=maxn;i++)
{
if(!vis[i])
{
prime[cnt++]=i;
for(int j=i*;j<=maxn;j+=i) vis[j]=true;
}
}
}
void solve(ll n,ll d)//n为相乘的数 当为分子时d为1 为分母时d为-1 很好理解 对应指数+1或-1嘛
{
for(int i=;i<cnt;i++)
{
while(n%prime[i]==)
{
n/=prime[i];
e[i]+=d;
}
if(n==) return ;
}
}
int main()
{
ll p,q,r,s;
double ans;
memset(vis,false,sizeof(vis));
is_prime();
// for(int i=0;i<cnt;i++) cout<<prime[i]<<" ";
// cout<<endl;
while(cin>>p>>q>>r>>s)
{
ans=;
memset(e,,sizeof(e));
for(int i=p;i>=;i--) solve(i,);
for(int i=p-q;i>=;i--) solve(i,-);
for(int i=q;i>=;i--) solve(i,-);
for(int i=r-s;i>=;i--) solve(i,);
for(int i=s;i>=;i--) solve(i,);
for(int i=r;i>=;i--) solve(i,-);
for(int i=;i<cnt;i++)
if(e[i]) ans*=pow(prime[i],e[i]); printf("%.5lf\n",ans);
}
}

Choose and divide(唯一分解定理)的更多相关文章

  1. 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 ...

  2. UVA - 10375 Choose and divide[唯一分解定理]

    UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  3. UVA 10375 Choose and divide【唯一分解定理】

    题意:求C(p,q)/C(r,s),4个数均小于10000,答案不大于10^8 思路:根据答案的范围猜测,不需要使用高精度.根据唯一分解定理,每一个数都可以分解成若干素数相乘.先求出10000以内的所 ...

  4. 【暑假】[数学]UVa 10375 Choose and divide

    UVa 10375 Choose and divide 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19601 思路 ...

  5. 唯一分解定理(以Minimun Sum LCM UVa 10791为例)

    唯一分解定理是指任何正整数都可以分解为一些素数的幂之积,即任意正整数n=a1^p1*a2^p2*...*ai^pi:其中ai为任意素数,pi为任意整数. 题意是输入整数n,求至少2个整数,使得它们的最 ...

  6. POJ - 1845 G - Sumdiv (唯一分解定理)

    Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S m ...

  7. B - Common Divisors (codeforces)数论算法基本定理,唯一分解定理模板

    You are given an array aa consisting of nn integers. Your task is to say the number of such positive ...

  8. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  9. 1341 - Aladdin and the Flying Carpet ---light oj (唯一分解定理+素数筛选)

    http://lightoj.com/volume_showproblem.php?problem=1341 题目大意: 给你矩形的面积(矩形的边长都是正整数),让你求最小的边大于等于b的矩形的个数. ...

随机推荐

  1. Linux脚本设计4——一些实用程序

    实用程序1:列目录 #!/bin/bash path=`echo $PATH | sed 's/:/ /g'` for d in $path do echo $d done 这是一个for循环,注意p ...

  2. a标签空的情况下 IE6 IE7下点击无效

    如果给空a标签定义了宽度和高度且使用了absolute,则在IE6和IE7中点击无效. 两种解决方法(主要是针对a标签不能设置背景情况):         1.给a标签添加样式:background: ...

  3. 浏览器显示XML文档

    在网站后台管理介面上,有一个预览铵钮,管理员能点一点,把XML的文档显示于浏览器上.这个XML文档如下: HTML Markup: 去.aspx.cs写ButtonPreview_Click事件: 运 ...

  4. jmeter - 录制web网页

    1.       打开JMeter工具 创建一个线程组(右键点击“测试计划”--->“添加”---->“线程组”) 创建一个http代理服务器(右键点击“工作台”--->“添加”-- ...

  5. IDEA mybatis-generator 逆向工程

    1.在maven工程中的resource中创建generatorConfig.xml 2.配置generatorConfig.xml <?xml version="1.0" ...

  6. [SHOI2002]百事世界杯之旅

    题目:"--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽奖活动,获得球星背包,随声听,更克赴日韩观看世界杯. ...

  7. IDEA中jsp页面写out.println会报错?

    解决办法: (1)在WEB-INF目录下新建一个lib目录,并把Tomcat安装目录下的如下两个jar包复制过来. (2)选择jsp-api.jar,右键,Add as Library. (3)在Fi ...

  8. 【Ant】How to print all the system properties in Ant build file

    在Ant里可以使用echoproperties task来达到目的 <target name="run"> <echoproperties /> </ ...

  9. Mysql 在DOS窗口下的操作

    1.登录 (1)首先cd 进入mysql对应的安装目录 (2)再输入mysql -u root -p 2.重启 https://blog.csdn.net/u012385190/article/det ...

  10. LeeCode(No2 - Add Two Numbers)

    LeeCode是一个有意思的编程网站,主要考察程序员的算法 第二题: You are given two non-empty linked lists representing two non-neg ...