首页 > 其他分享 >P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题

时间:2023-12-17 17:36:58浏览次数:29  
标签:NOIP2001 公倍数 最小 sqrt 60 枚举 P1029 公因数

首先最大公因数和最小公倍数之积等于两个原数的积,这是基本性质 然后两个数中,最小也是大于等于最大公因数,最大不超过最小公倍数 最暴力的方法是,在这个范围内遍历其中一个数,积除以这个数得到另一个数,然后用辗转相除法进行判断就可以求解。 当然,可以缩短范围。缩短范围有两个基本思想: 以下称满足条件的数分别为p,以及q (一):只有是最大公因数倍数,或者是最小公倍数约数的数的枚举才有意义,因此可以初始值为x,每次加x(枚举最大公因数的倍数),或者用y/i来枚举其约数,i初始时为1,y%i==0时才判断gcd。   (二):显然,如果最大公因数是2,最小公倍数是60,那么两个数的积是120,满足这个条件的p,q是成对的,并且在sqrt(120)前后是对称的。因此枚举数的时候,结束条件可以是小于等于sqrt(120),然后在结束后将结果乘以2即可。但是这会出现一个问题,因为如果sqrt(xy)是一个整数,那么在枚举x=sqrt(xy)时求得的p=q,此答案并没有"成对"不该被乘以二,需要特判,或者开一个flag变量,在结尾时判断flag减去多加的1。   对于(一)中提出的性质,有一个更进一步的剪枝方法。如果用枚举最小公倍数的约数,我们实际上是得到y%i==0后,将y/i与xy/(y/i)=xi,这两个数进行gcd判断。那么同样以上面的最小公倍数为60举例,如果我们将i从1枚举到60,当我们得到y/i=60后,实际上,也已经得知了后面一定会枚举到y/i=1(i=60时),因为i和y/i都是y的约数。可以发现,其实对于i和y/i,其在sqrt(60)前后也是对称的,因此循环进行的条件可以为i小于根号y。 这个与上面的(二)的不同是,(二)中枚举一次p或者q,只进行一次gcd判断。而这个(一)的进一步剪枝,则每次枚举i(即枚举了q=y/i),要进行两次gcd判断,一次是以i为q,一次是以y/i为q。当然这里也要注意特判,如果会出现p=q,那就只能判断一次,不要加了两次ans。这种判断出来的结果不需要乘以2.

标签:NOIP2001,公倍数,最小,sqrt,60,枚举,P1029,公因数
From: https://www.cnblogs.com/OKM-IS/p/17909400.html

相关文章

  • 求两数的最大公约数和最小公倍数的n种方法
    最大公约数:公约数,亦称“公因数”。它是指能同时整除几个整数的数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。对任意的若干个正整数,1总是它们的公因数。最小公倍数:两个或多个整数公有的倍数中,除0以外最小的一个公倍数。......
  • 求其最大公约数和最小公倍数,一行代码完成
    题目:输入两个正整数m和n,求其最大公约数和最小公倍数。求出最大公约数就行,最小公倍数用m*n除以最大公约数就行packagemyself;importjava.util.Scanner;/***@AutherQY*@Date2023/12/11*/publicclassSix{publicstaticvoidmain(String[]args){......
  • P1024 [NOIP2001 提高组] 一元三次方程求解( 普及- ) 题解
    题目传送门思路:1可以直接暴力2二分搜索答案3盛金公式一元三次方程:\(ax^3+cx^2+d=0\)重根判别公式:\(A=b^2-3ac\)\(B=bc-9ad\)\(C=c^2-3bd\)当\(A=B=0\)时,\(X1=X2=X3=-b/3a=-c/b=-3d/c\)4牛顿迭代法:对于一个已知的x值,每一次根据函数在这一点的导数,把x移动到,切......
  • n个数算最小公倍数(优化版)
    #include<stdio.h>intret(intx,inty){  inti=1;  if(x%y==0||y%x==0)    return(x>y?x:y);  else  {   for(i=1;i<=x*y;i++)    {      i=x*i;      if(i%y==0) ......
  • P1029 最大公约数和最小公倍数问题(普及−) 题解
    题目传送门想要做这题,我们要先了解一下最大公约数。最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短......
  • 求四个数的最小公倍数
    #include<stdio.h>longintfact(longintx,longinty){ inti,j;  for(i=1;i<=x*y;i++) {  if(x%y==0||y%x==0)  {  returnx>y?y:x;  break;  }    j=x*i;  if(j%y==0)  {  returnj;......
  • 求两个数的最小公倍数
    #include<stdio.h>intmain(){  inti,j,k,t=0;  printf("请输入两个数:");  scanf_s("%d,%d",&i,&j);   for(k=1;k<=i*j;k++)  {       if(i%j==0||j%i==0)    {      printf("%d,%d......
  • Java 求两个数的最大公约数和最小公倍数(理解原理 > 背诵)
    解题需知原理,背诵来的知识只能支撑一时。为什么反复执行a%b,即可得到最大公约数?(设定前提是a>b)其中的数学原理就是:a和b的最大公约数完全等同于 b和a%b的最大公约数,证明在这里:辗转相除法求解最大公约数和最小公倍数的数学原理-知乎求得最大公约数d以后,比方说:a=x*......
  • P1025 [NOIP2001 提高组] 数的划分 题解
    题目传送门本题共有两种方法,分别是递归深搜和动态规划方法一:递归深搜Solution从小到大一一枚举每一个划分的数,。只要找到一种方案就记录,具体细节代码中有注释。Code#include<bits/stdc++.h>usingnamespacestd;intn,k,ans;voiddfs(intstart,intstep,intsum){......
  • 简单数学函数(最小公倍数与最大公约数与快速幂)
    最大公约数(\(gcd\)):intgcd(inta,intb){returnb?gcd(b,a%b):a;}最小公倍数(\(lcm\)):intlcm(inta,intb){returna/gcd(a,b)*b;//注意:除数为gcd(a,b)}快速幂:template<typenameA,typenameB,typenameC>Cpow(Ax,By,Cp){ if(x==......