`

【数论法求一堆数的最小公倍数,结果高达几千位】LOJ 1024 Eid

阅读更多

KIDx的解题报告

题意:求n个数的最小公倍数,结果很大,得用高精度

 

题目链接:http://lightoj.com/volume_showproblem.php?problem=1024

 

找出每个数的素因子p,p必为最小公倍数的因子,最小公倍数中p的个数就是每个数的p的个数的最大值,最后,最小公倍数的因子及其个数都知道了,用高精度乘起来就是结果了,我这里用的是10000进制计算

 

 

#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <set>
//#include <map>
#include <queue>
#include <utility>
#include <iomanip>
#include <stack>
#include <list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <ctype.h>
using namespace std;
#define M 1305

int res[M], p[M], cnt[10005], fac[M];
bool hash[10005];

int main ()
{
	int i, j, t, n, k = 0, x, w, cc = 1, m;
	/*****************素数打表*****************/
	for (i = 2; i < 10001; i++)
	{
		if (!hash[i])
		{
			p[k++] = i;
			for (j = i << 1; j < 10001; j+=i)
				if (!hash[j])
					hash[j] = true;
		}
	}
	/*****************素数打表*****************/
	scanf ("%d", &t);
	while (t--)
	{
		scanf ("%d", &n);
		memset (cnt, 0, sizeof(cnt));
		int id = 0;
		while (n--)
		{
			scanf ("%d", &x);
			for (i = 0; i < k && p[i] <= x; i++)
			{
				int tp = 0;
				while (x % p[i] == 0)
					tp++, x /= p[i];
				if (tp > cnt[p[i]])
				{
					if (cnt[p[i]] == 0) fac[id++] = p[i];//记录最小公倍数中的素因子
					cnt[p[i]] = tp;		//记录素因子p[i]的最大个数
				}
			}
		}
		m = 1;		//初始时res的位数
		w = 0;		//进位
		memset (res, 0, sizeof(res));
		res[0] = 1;	//初始时res是1
		for (i = 0; i < id; i++)
		{
			for (j = 0; j < cnt[fac[i]]; j++)
			{	//最小公倍数中一共有cnt[fac[i]]个fac[i]因子,所以要乘cnt[fac[i]]次
				for (x = 0; x < m; x++)		//按位相乘
				{
					res[x] = res[x] * fac[i] + w;
					w = 0;		//进位用过以后记得清0
					if (res[x] >= 10000)
						w = res[x] / 10000, res[x] %= 10000;
				}
				while (w > 0)
					res[m++] = w % 10000, w /= 10000;
			}
		}
		printf ("Case %d: %d", cc++, res[m-1]);
		//因为是第一个数,不用补足4位,因为不能有前导0
		for (i = m - 2; i >= 0; i--)
			printf ("%04d", res[i]);
		//用的一万进制,中间部分的数要补足4位
		printf ("\n");
	}
	return 0;
}

  

1
0
分享到:
评论

相关推荐

    求两个数的最大公约数和最小公倍数

    求最小公倍数通常可以利用最大公约数来计算,公式为:两数的乘积除以它们的最大公约数等于最小公倍数,即LCM(a, b) = |a * b| / GCD(a, b)。 在Java中,我们可以创建一个类`GcdAndLcm`,并在其中定义两个方法`gcd...

    初等数论中最大公约数、最小公倍数(递归实现)程序

    在计算机科学领域,尤其是编程实践中,我们经常需要处理数学问题,其中包括初等数论中的概念,如最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)。这两个概念在算法设计和...

    VB 用函数求最小公倍数

    如果需要计算多个数的最小公倍数,我们可以采用以下策略:首先计算前两个数的最小公倍数,然后将这个结果与下一个数进行计算,依次类推。例如,要计算三个数 a、b 和 c 的最小公倍数,我们可以这样做: ```vb ...

    如何求几个数的最小公倍数和最大公因数.pdf

    如何求几个数的最小公倍数和最大公因数 本文主要介绍了如何求几个数的最小公倍数和最大公因数,以及他们之间的关系。文章首先介绍了最大公因数和最小公倍数的概念,以及他们在小学数学中的重要性。然后,文章详细...

    Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例

    而对于最小公倍数,由于Python标准库中并没有内置函数直接计算LCM,我们通常需要通过最大公约数来求得LCM,因为根据数学性质,两个数a和b的最小公倍数可以通过它们的乘积除以最大公约数得到,即LCM(a, b) = (a * b) ...

    算法-数论- 最大公约数与最小公倍数.rar

    算法-数论- 最大公约数与最小公倍数.rar

    初等数论第一章第5节最小公倍数.ppt

    初等数论第一章第五节最小公倍数 本节内容主要讲解了最小公倍数的定义和性质。首先,定义最小公倍数:如果整数a和b的公倍数中存在一个最小的正整数,那么称之为最小公倍数,记为[a,b]。然后,prove了一些定理和推论...

    VB求两个数的最大公约数和最小公倍数工具和源码

    这个名为"求两个数的最大公约数和最小公倍数"的VB程序,提供了一个简单直观的界面,帮助用户快速计算两个数的GCD和LCM,对于学习VB编程和理解算法概念非常有帮助。通过查看源码,开发者可以深入理解如何在VB环境中...

    最小公倍数与最大公约数

    在这个Java程序中,我们看到如何使用辗转相除法(也称为欧几里得算法)来计算两个数的最大公约数,并基于这个最大公约数进一步计算两个或三个数的最小公倍数。 **最大公约数(GCD):** 最大公约数是指能同时整除...

    求最大公约数和最小公倍数的程序

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是基本的数论概念,它们广泛应用于算法设计、数据分析以及计算机科学的多个分支。VB(Visual Basic)是一种流行...

    编写一个方法,求两个自然数的最大公约数和最小公倍数

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是基本的数论概念,它们广泛应用于算法设计、数据分析以及软件开发的各个层面。在C#语言中,我们可以使用多种...

    优秀资料(2021-2022年收藏)小学数学《公倍数和最小公倍数》说课稿二.doc

    小学数学课程中的《公倍数和最小公倍数》是一个重要的数论概念,通常在学生已经掌握了倍数和因数的基础知识后进行教学。这部分内容是为后续学习通分做铺垫,旨在培养学生的数学思维能力和解决问题的能力。 教学目标...

    最大公约数和最小公倍数(C语言)

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是基本的数论概念,它们在处理整数运算时经常被用到。在这个C语言的例子中,我们看到如何编写一个程序来计算两...

    五年级数学下册第二单元异分母分数加减法2.5求两个数的最小公倍数课时练冀教版

    在小学五年级数学下册的第二单元中,学生们会学习到异分母分数的加减法以及如何求两个数的最小公倍数。这是一项重要的数学技能,它为日后的数学学习打下了坚实的基础。本课时练习主要针对求两个数的最小公倍数这一...

    C++ 递归 最大公约数与最小公倍数

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是两个重要的数论概念,它们广泛应用于算法设计、数据分析以及数学问题解决。在这个C++程序中,我们使用递归...

    求最大公约数和最小公倍数的方法C++

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是两个基本的数论概念,它们在算法设计、数据结构和许多其他计算任务中都有应用。本文将详细介绍如何用C++语言...

    最大公约数与最小公倍数程序

    - 通过最大公约数来求最小公倍数是一种常见的方法。具体公式为: \[ \text{LCM}(a, b) = \frac{a \times b}{\text{GCD}(a, b)} \] - **解释**:由于a和b的乘积等于它们的最大公约数与最小公倍数的乘积,因此可以...

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

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是基本的数论概念,它们广泛应用于计算机科学中,尤其是在算法设计、数据结构以及加密技术等领域。这篇文档显然...

    求两个整数的最大公约数、最小公倍数,VB6.0源代码编写

    在编程领域,最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是基本的数论概念,它们广泛应用于算法设计和数学问题解决。VB6.0(Visual Basic 6.0)是微软开发的一种可视化...

    求多个数的最大公约数,最小公倍数以及hanks博士问题

    求多个数的最大公约数,最小公倍数以及hanks博士son问题,数论问题

Global site tag (gtag.js) - Google Analytics