题目链接

  http://acm.hdu.edu.cn/showproblem.php?pid=4497

题目大意

  求gcd(x,y,z)=G且lcm(x,y,z)=L的方法数。

题目分析

  起初这道题一点想法都没有。。看了题解才有些想法。

  首先如果L不能被G整除的话,这样的组合一定不存在。

  当这样的组合存在的时候,所求与  求gcd(x,y,z)=1且lcm(x,y,z)=L/G的方法数是等价的。

  那么:令temp=L/G。

  对temp进行素数分解:temp=p1^t1 * p2^t2 * ……* pn^tn。

  因为temp是这三个数的倍数,因而x,y,z的组成形式为:

  x=p1^i1 * p2^i2 *…… * pn^in;

  y=p1^j1 * p2^j2 *…… * pn^jn;

  z=p1^k1 * p2^k2 * …… * pn^kn;

  对于某一个素因子p:

          因为要满足x,y,z的最大公约数为1,即三个数没有共同的素因子,所以min(i,j,k)=0。

          又因为要满足x,y,z的最小公倍数为temp,即p^t必然要至少存在一个,所以max(i,j,k)=t。

          换言之:至少要有一个p^t,以满足lcm的要求;至多有两个包含p,以满足gcd的要求。

          因而基本的组合方式为(0,p^t,p^k),k=0-->t。

          而因为(1,2,3)和(2,1,3)是不同的方法,所有满足要求的方法中,除了(0,0,t)和(0,t,t)各有3种排列之外,其余都有6种排列。

          对于某一个素因子p总的方法数为6*(t-1)+2*3=6*t。

  在根据组合排列的知识,素数与素数之间是分步的关系,因而总的方法数为:6*(t1+t2+……+tn)

  那么这道题另外一个地方就是素因子分解的部分了,详细请见本博POJ1845(http://www.cnblogs.com/xiaozhuyang/p/POJ1845-Sumdiv.html)中的相关知识。

  反过来想,这道题的出发基础是“整数唯一分解定理”,每一个数都能分解成若干个质数相乘的形式。

 

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int main()
{
int t;
cin>>t;
while(t--)
{
int G,L;
int ti[];
cin>>G>>L;
if(L%G)
{
cout<<<<endl;
continue;
}
int temp=L/G;
int k=;
for(int i=;i*i<=temp;)//根号法+奇偶法+递归
{
if(temp%i==)
{
ti[k]=;
while(temp%i==)
{
ti[k]++;
temp/=i;
}
k++;
} if(i==)
i++;
else
i+=;
}
if(temp!=)//如果temp本身就是个质数
ti[k++]=; long long ans=1LL;
for(int i=;i<k;i++)
{
ans*=(*ti[i]);
}
cout<<ans<<endl;
}
return ;
}

HDU4497

  

  

HDU4497GCD and LMC最大公约数与最小公倍数的更多相关文章

  1. 求N个数的最大公约数和最小公倍数(转)

    除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表 ...

  2. Java程序设计之最大公约数和最小公倍数

    题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...

  3. 辗转相除法求最大公约数和最小公倍数【gcd】

    要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } ...

  4. PAT - 基础 - 最大公约数和最小公倍数

    题目: 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出2个正整数M和N(<=1000). 输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1 ...

  5. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

  6. c语言求最大公约数和最小公倍数

    求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...

  7. Java经典案例之-“最大公约数和最小公倍数”

    /** * 描述:输入两个正整数m和n,求其最大公约数和最小公倍数.(最大公约数:最大公约数, * 也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个.) * (最小公倍数:几个数共有的 ...

  8. 求m和n的最大公约数和最小公倍数

    题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 做这道题时,特意去查看了一下什么是最大公约数和最小公倍数. 后来直接去看了求解的思想,相信到企业中不会要求你闭门造车,若已有先例,可以研究之后 ...

  9. HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)

    话不多说,日常一水题,水水更健康!┗|`O′|┛ 嗷~~ a/b + c/d Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768 ...

随机推荐

  1. mongoose简单使用样例

    新建文件 app.js 内容如下: var mongoose = require('mongoose') , Schema = mongoose.Schema; mongoose.connect('m ...

  2. 我的python之路【第二篇】数据类型与方法

    一.Python中有哪些数据类型 整型 在32位的系统中: 取值范围就是-(2^31) 到2^31-1 在64位系统中:   取值范围就是-(2^63) 到2^63-1 浮点型 布尔型 字符型 字符串 ...

  3. vue的使用总结

    1.vue的生命周期

  4. git工具使用方法及常用命令

    git下载地址:https://git-for-windows.github.io/git环境变量配置:增加:GIT_HOME = C:\Git (文件夹为git软件的安装文件夹)Path添加: %G ...

  5. Spring MVC ajax:post/get 的具体实现

    Post 方式 1.自动注入 a. pom.xml ---- 配置Maven,添加必要的jar包 <!--用于 String-JSONObject 转换 --> <dependenc ...

  6. OpenCV局部变形算法探究

    OpenCV是跨平台的强大的计算机视觉识别和图像处理的开源库,可以利用他来实现:模式识别.构建神经网络.深度学习,总之用途多多,入门级就先做一下图像处理吧! 基本的图像处理算法(图像灰阶化.二值化.仿 ...

  7. [SinGuLaRiTy] 高精度算法代码库

    [SinGuLaRiTy-1001] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 加法: #include<stdio.h> ...

  8. Spring框架下的单元测试

    一.使用spring中对Junit框架的整合功能 除了junit4和spring的jar包,还需要spring-test.jar.引入如下依赖: <dependency> <grou ...

  9. 老李分享:Mac快捷键

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  10. python selenium2示例 - 生成 HTMLTestRunner 测试报告

    前言 在python selenium2自动化测试过程中,一个合适的报告是必须的,而HTMLTestRunner模块为我们提供了一个很好的报告生成功能. 什么是HTMLTestRunner HTMLT ...