HDU4497GCD and LMC最大公约数与最小公倍数
题目链接:
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最大公约数与最小公倍数的更多相关文章
- 求N个数的最大公约数和最小公倍数(转)
除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表 ...
- Java程序设计之最大公约数和最小公倍数
题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...
- 辗转相除法求最大公约数和最小公倍数【gcd】
要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } ...
- PAT - 基础 - 最大公约数和最小公倍数
题目: 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出2个正整数M和N(<=1000). 输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1 ...
- c 求两个整数的最大公约数和最小公倍数
//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...
- c语言求最大公约数和最小公倍数
求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...
- Java经典案例之-“最大公约数和最小公倍数”
/** * 描述:输入两个正整数m和n,求其最大公约数和最小公倍数.(最大公约数:最大公约数, * 也称最大公因数.最大公因子,指两个或多个整数共有约数中最大的一个.) * (最小公倍数:几个数共有的 ...
- 求m和n的最大公约数和最小公倍数
题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 做这道题时,特意去查看了一下什么是最大公约数和最小公倍数. 后来直接去看了求解的思想,相信到企业中不会要求你闭门造车,若已有先例,可以研究之后 ...
- HDU 2503 a/b + c/d(最大公约数与最小公倍数,板子题)
话不多说,日常一水题,水水更健康!┗|`O′|┛ 嗷~~ a/b + c/d Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768 ...
随机推荐
- python复习。知识点小记
1.对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符: >>> ord('A') >>> ord('中' ...
- js面向对象-原型链
var Person = function (name) { this.name = name; } Person.prototype.say = function () { console.log( ...
- XML配置文件的命名空间与Spring配置文件中的头
一直以来,写Spring配置文件,都是把其他配置文件的头拷贝过来,最多改改版本号,也不清楚哪些是需要的,到底是干嘛的.今天整理一下,拒绝再无脑copy. 一.Spring配置文件常见的配置头 < ...
- Linux之第一个shell命令
今天在学习shell脚本的编写,网上看了一个helloworld的栗子: #!/bin/sh #print hello world in the console window a = "he ...
- xml转义符
今天在看项目的UrlRewriteFilter(动态url静态化,有利于搜索引擎搜索)的配置文件urlrewrite.xml时,看到了“&”字符,查询之后才知道xml文件中的转义比html中的 ...
- iOS StoreKit
简述: 本文讲解iOS系统框架StoreKit中的SKStoreProductViewController与SKStoreReviewController这两个Controller. SKStoreP ...
- Java开发—乘风破浪
最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.手头的基本完成了,因此打算好好来熟悉下java的相关工具库,需要借助你们,好好的在JAV ...
- Centos/RHEL上查看主板型号
老是搞忘记,专门做个记录: [root@media ~]# dmidecode | grep "Product Name" Product Name: To be filled b ...
- Hibernate基础学习(一)—初识Hibernate
一.对象的持久化 狭义的理解: 持久化仅仅指把对象永久的保存到数据库中. 广义的理解: 持久化包括和数据库相关的各种操作. 保存: 把对象永久保存到数据库中. 更新: ...
- 在开源中国(oschina)上创建托管项目
***************************************************************** 目标: 1.能上传自己的项目到oschina上并且进行管理 2.能进 ...