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

唯一分解定理:任何一个大于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. 什么是MTU,如何检测和设置路由器MTU值

    最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡.串口 ...

  2. LeetCode第110题:平衡二叉树

    问题描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,nu ...

  3. [学习笔记]scanf弊端以及解决方案

    #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main(void) { ]; //mems ...

  4. 温故而知新_C语言_前缀++(--)和后缀++(--)

    前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...

  5. 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机

    [bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...

  6. Linux之杀掉进程

    pkill命令可以按照进程名杀死进程.pkill和killall应用方法差不多,也是直接杀死运行中的程序:如果您想杀掉单个进程,请用kill来杀掉. 语法 pkill(选项)(参数) 选项 -o:仅向 ...

  7. jq表单验证

    <body> <form method="post" action=""> <div class="int"& ...

  8. Python脚本开发练习

    打印乘法口诀表 #!/usr/bin/python #coding=utf-8 print("Hello,World....") print("你好,欢迎来到Python ...

  9. C. The Fair Nut and String 递推分段形dp

    C. The Fair Nut and String 递推分段形dp 题意 给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得 对于任意一个\(p_i\) , \(s[p_i]==a ...

  10. LOJ2565 SDOI2018 旧试题 莫比乌斯反演、三元环计数

    传送门 这道题的思路似乎可以给很多同时枚举三个量的反演题目提供一个很好的启发-- 首先有结论:\(d(ijk) = \sum\limits_{x|i}\sum\limits_{y|j}\sum\lim ...