首页 > 其他分享 >如何快速求一个序列的gcd和lcm

如何快速求一个序列的gcd和lcm

时间:2024-09-06 17:48:36浏览次数:11  
标签:return gcd long ans 序列 lcm lld

背景:
教授在打某道关于序列gcd与lcm的题,但是看不懂题解,于是决定打表找规律;然而自己又懒得算数,于是写了个程序。
使用说明:
输入格式:n str a1 a2 ... an,\(n\) 为序列长度;str为操作种类,只有GCDLCM;\(a\) 为序列,其中所有元素都必须是自然数。
如果输入不合法,程序会中断计算并返回错误信息;否则会直接输出答案。
代码:

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ri register int
#define inf 0x3f3f3f3f
char c[4];
long long a,b;
unsigned long long ans;
il long long gcd(long long x,long long y)
{
	if(!x&&!y)
	{
		return 1;
	}
	if(!x)
	{
		return y;
	}
	if(!y)
	{
		return x;
	}
	while(1)
	{
		if(x<y)
		{
			swap(x,y);
		}
		x%=y;
		if(!x)
		{
			return y;
		}
	}
}
int main()
{
	while(1)
	{
		scanf("%s",c);
		if(!strcmp(c,"GCD"))
		{
			scanf("%lld",&a);
			if(a<0)
			{
				puts("ERROR: 序列大小必须是自然数");
				continue;
			}
			ans=0;
			while(a--)
			{
				scanf("%lld",&b);
				if(b<0)
				{
					puts("ERROR: 序列元素必须是自然数");
					break;
				}
				ans=gcd(ans,b);
			}
			if(b>=0)
			{
				printf("%lld\n",ans);
			}
			continue;
		}
		if(!strcmp(c,"LCM"))
		{
			scanf("%lld",&a);
			if(a<0)
			{
				puts("ERROR: 序列大小必须是自然数");
				continue;
			}
			ans=1;
			while(a--)
			{
				scanf("%lld",&b);
				if(b<0)
				{
					puts("ERROR: 序列元素必须是自然数");
					break;
				}
				ans/=gcd(ans,b);
				ans*=b;
			}
			if(b>=0)
			{
				printf("%lld\n",ans);
			}
			continue;
		}
		puts("ERROR: 操作无效");
	}
	return 0;
}
/*
in:n op a_1...a_n
0<=a<=2^32
*/

效果不错。
image

标签:return,gcd,long,ans,序列,lcm,lld
From: https://www.cnblogs.com/ywhhdjser-97/p/18400715

相关文章

  • 机器学习、生成式AI和深度学习时间序列模型(含代码)
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:    本文转自一篇论文,主要讨论了在不同行业中时间序列预测的重要性,以及如何利用机器学习、生成式人工智能(GenerativeAI)和深度学习来提高预测的准确性。时间序列数据是按特定时间间隔收集或记录的数据点......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述   奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本......
  • 基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
    1.程序功能描述奇异谱分析(SingularSpectrumAnalysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。2.测试软件版本以及......
  • AbMole|DNA双链断裂修复中的序列与染色质特征:MRX复合体的作用与机制
     在生物学领域中,DNA双链断裂(DSB)作为一种极具破坏性的基因组损伤,其准确且高效的修复对于维持细胞基因组的稳定性和功能至关重要。由来自哥伦比亚大学欧文医学中心微生物学与免疫学系的RobertGnügge和瑞士苏黎世工业大学(ETH)生物化学研究所生物系的 GiordanoReginato,Petr......
  • 用Python实现时间序列模型实战——Day 11: 指数平滑模型
    一、学习内容1.简单指数平滑法简单指数平滑法:简单指数平滑法(SimpleExponentialSmoothing,SES)是一种用于平滑时间序列数据的技术,通过对数据赋予不同的指数权重,较新的数据点权重更高。SES适用于平稳的时间序列数据,即没有显著趋势和季节性成分的时间序列。SES模型的......
  • 每日OJ_牛客_最长递增子序列(dp/贪心模板)
    目录牛客_最长递增子序列(dp/贪心模板)解析代码牛客_最长递增子序列(dp/贪心模板)最长公共子序列__牛客网解析代码在一个序列中找最长递增子序列,动态规划的典型应用,下面是两个模版CISdp模板:#include<iostream>#include<vector>usingnamespacestd;intLIS(vect......
  • 最大上升子序列 II
    序列:可以不连续,但与原数列当中出现的先后顺序要相同;上升子序列:需要满足单调性-单调递增算法1(贪心+二分)O(nlogn)时间复杂度二分查找一个数的最小的最大值O(logn);一共有n个数进行二分O(nlogn);贪心分析样例:731218561.首先分析长度为1的上升子序列—......
  • java 二次反序列化
    java二次反序列化SignedObject该类是java.security下一个用于创建真实运行时对象的类,更具体地说,SignedObject包含另一个Serializable对象。先看其构造函数方法。看到参数接受一个可序列化的对象,然后又进行了一次序列化,继续看到该类的getObject方法(这是个getter方法......
  • NOIP2024集训Day20 DP常见模型1 - 序列
    NOIP2024集训Day20DP常见模型1-序列A.[JOI2022Final]Let'sWintheElection贪心+DP。首先,一定是所有协作者同时在同一个州演讲,这样才最优。然后,假设我们已经知道所有州的方案(支持、支持+协作、反对),那我们一定是先按照从小到大的顺序拿下所有“支持+协作”州,这样最优。......
  • 【漏洞复现】通达OA v11.7 moare 反序列化漏洞
    免责声明:        本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规......