数论(lcm)
2024-08-29 19:47:00
题意:求最小的lcm(a,b)的下标;
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f3f3f3f3fLL
#define mod 1000000007
#define PI acos(-1)
using namespace std;
typedef long long ll ;
const int N = 1e7 + ;
int p[N] , n; int main()
{
int x , flaga , flagb ;//值,左下标,右下标
ll minv ;//最小lcm值
while(~scanf("%d" , &n))
{
memset(p , , sizeof(p));//标记数组
minv = INF ;
for(int i = ; i <= n ; i++)
{
scanf("%d" , &x);
if(p[x] && x < minv)//出现了两次且小于原lcm,更新
{
minv = x ;
flaga = p[x];
flagb = i ;
}
p[x] = i ;//标记该数出现
}
for(int i = ; i < N && i < minv ; i++)//遍历1-1e7+5数
{
ll v = ;
int pos ;
for(int j = i ; j < N && j < minv ; j+=i)//成倍数的遍历。
{
if(p[j])//该数出现
{
if(v==)//第一个数
{
v = j ;
pos = p[j];
}
else if(v / i * j < minv)//第二个数出现,且小于原lcm更新。
{
minv = v / i * j ;
flaga = pos ;
flagb = p[j];
}
else
{
break ;
}
}
}
}
if(flaga > flagb) swap(flaga , flagb);
cout << flaga << " " << flagb << endl;
} return ;
}
最新文章
- JS截取,删除,替换字符串常用方法详细
- C#利用摄像头拍照功能实现
- jquery 多选框的问题
- iOS YSMine 通用设置
- NLog在.NET Core Console Apps中的简单应用
- lightOJ 1326 Race(第二类Stirling数)
- SAE搭建WordPress教程 免费建WordPress博客站
- 转载:C# 之泛型详解
- Kafka笔记--监控系统KafkaOffsetMonitor
- SOLID 设计原则 In C# 代码实现
- C#之实参和形参
- LinuxRPM包安装
- [Swift]LeetCode551. 学生出勤纪录 I | Student Attendance Record I
- 工控随笔_04_西门子_解决Step 7软件因授权问题不能打开的方式和方法
- storm学习总结
- bootstrap 列表組
- Oracle不能并行直接添加主键的方法:先建唯一索引后建主键
- 25 行 Python 代码实现人脸识别——OpenCV 技术教程
- MySQL死锁问题分析及解决方法实例详解(转)
- Leetcode题库——49.字母异位词分组【##】