CF1349A Orac and LCM 题解
2024-08-26 22:37:05
题意分析
给出$n$个数,求这$n$个数两两的最小公倍数的最大公约数
思路分析
通过分析样例可以发现,如果要成为这$n$个数两两的最小公倍数的公约数,至少要是这$n$个数中$n-1$个数的约数,否则就至少会有两个数的最小公倍数无法被这个数整除。
所以只要找出所有满足至少是这$n$个数中的$n-1$个数的约数的数就可以了。找的方法很简单,只要每个数去试一下能整除被几个数就可以了。这里有几个需要注意的点:
- 找出的数应该是质数,否则可能会因为该数的约数已被找出而出错。可以不必先筛出质数,从小到大依次尝试并在找出一个数后除掉它可以保证找出的都是质数。
- 一个数作为约数时次数不一定为1,因此对于一个数要多次尝试
- 尝试的时候如果当前已经有2个数不能被整除,可以直接停止,节省时间
因为最后一点的剪枝,实际上全部尝试的次数很少,因此时间上完全过得去。
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=1e5+100;
int n,maxn;
int a[N];
ll ans=1;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),maxn=max(maxn,a[i]);
for(int i=2;i<=maxn;i++)
{
int cnt=0;
for(int j=1;j<=n &&(cnt==j-1 || cnt==j-2);j++)
if(a[j]%i==0)
cnt++;//尝试能整除几个数
if(cnt>=n-1)//满足条件
{
ans*=i;//累计答案
for(int j=1;j<=n;j++)
if(a[j]%i==0)
a[j]/=i;//除掉
i--;//再试一次
}
}
printf("%lld",ans);
return 0;
}
最新文章
- Android 网络开发之WIFI
- html/css 钢琴黑白格布局
- DataList:HTML5中的input输入框自动提示宝器
- 腾讯云Centos下Nginx反向代理Apache+Tomcat
- 普通用户如何临时获取root权限
- 基于jQuery标题有打字效果的焦点图
- hdu1031 Design T-Shirt
- 10个最佳的PHP图像操作库
- Tomcat - 持久化 Session
- Swift—计算属性-备
- SQL语言学习-数据定义语言
- (转)Java通过axis调用WebService
- uva315(求割点数目)
- cocos2d-x于android在call to OpenGL ES API with no current context
- JTree demo
- Java Web整合开发(3) -- Servlet
- [Swift]LeetCode164. 最大间距 | Maximum Gap
- Flask flask_script扩展库
- [dubbo] Dubbo API 笔记——配置参考
- 如何配置nginx负载均衡配置(轮询,权重,ip绑定)
热门文章
- 求100以内所有奇数的和,存于字变量X中。
- PDOStatement::errorInfo
- C/C++编程笔记:C语言制作情侣必备《爱情电子相册》,源码解析!
- luogu P4632 [APIO2018] New Home 新家 线段树 set 二分
- Idea风格的快捷键
- Linux发行版-Manjaro
- 7、Prototype 原型模式 通过复制创造实例 创造型模式
- SSM框架整合Demo
- C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)
- Homekit_Dohome_智能灯带