Codeforces 1154G Minimum Possible LCM
题目链接:http://codeforces.com/problemset/problem/1154/G
题目大意:
给定n个数,在这些数中选2个数,使这两个数的最小公倍数最小,输出这两个数的下标(如果有多组解,任意输出一组即可)。
分析:
直接2个循环两两配对一下肯定要超时的,这里可以考虑枚举公因数,因为LCM是与最大公因数相关的,如果我们枚举了所有的公因数,那么我们就枚举了所有的LCM。
对于每一个公因数d,含有因子d的数从小到大排序为x1,x2,x3……xn,共有n个。
首先计算一下前两个数的GCD,有2种可能:
1:如果GCD(x1,x2) == d,那就没必要再计算GCD(xi,xj) (1 < i < j <= n)了,只要计算一下LCM(x1,x2)即可,因为如果GCD(xi,xj) == d,LCM(xi,xj)肯定大于LCM(x1,x2);如果GCD(xi,xj) == d_ > d,LCM(xi,xj)有可能小于LCM(x1,x2),不过这个等d枚举到了d_再算也是一样的。
2:如果GCD(x1,x2) == d_ > d,没必要再计算LCM(x1,x2),可以等到枚举到d_再计算,也没必要再计算GCD(xi,xj),因为如果GCD(xi,xj) == d,LCM(xi,xj) = xi * xj / d > x1 * x2 / d > x1 * x2 / d_ = LCM(x1,x2);如果GCD(xi,xj) > d,也不需要。
代码如下:
#include <bits/stdc++.h>
using namespace std; #define Rep(i, n) for (int i = 0; i < (n); ++i)
#define rRep(i, n) for (int i = (n) - 1; i >= 0; --i)
#define For(i, s, t) for (int i = (s); i <= (t); ++i)
#define rFor(i, t, s) for (int i = (t); i >= (s); --i)
#define foreach(i, c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
#define rforeach(i, c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) #define INIT() std::ios::sync_with_stdio(false);std::cin.tie(0);
#define pr(x) cout << #x << " = " << x << " "
#define prln(x) cout << #x << " = " << x << endl
#define EL() printf("\n")
#define GL(s) getline(cin, (s))
#define SHOW_VECTOR(v) {std::cerr << #v << "\t:"; for(const auto& xxx : v){std::cerr << xxx << " ";} std::cerr << "\n";}
#define SHOW_MAP(v) {std::cerr << #v << endl; for(const auto& xxx: v){std::cerr << xxx.first << " " << xxx.second << "\n";}} template<typename T1, typename T2>
istream &operator>>(istream &in, pair<T1, T2> &p) {
in >> p.first >> p.second;
return in;
} template<typename T>
istream &operator>>(istream &in, vector<T> &v) {
for (auto &x: v)
in >> x;
return in;
} template<typename T1, typename T2>
ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
out << "[" << p.first << ", " << p.second << "]" << "\n";
return out;
} #define LOWBIT(x) ((x)&(-x)) #define ALL(x) x.begin(),x.end() #define ms0(a) memset(a,0,sizeof(a))
#define msI(a) memset(a,inf,sizeof(a))
#define msM(a) memset(a,-1,sizeof(a)) #define MP make_pair
#define PB push_back
#define ft first
#define sd second inline int gc(){
static const int BUF = 1e7;
static char buf[BUF], *bg = buf + BUF, *ed = bg; if(bg == ed) fread(bg = buf, , BUF, stdin);
return *bg++;
} inline int ri(){
int x = , f = , c = gc();
for(; c<||c>; f = c=='-'?-:f, c=gc());
for(; c>&&c<; x = x* + c - , c=gc());
return x*f;
} typedef long long LL;
typedef pair< int, int > PII;
typedef pair< LL, LL > PLL;
typedef map< int, int > MII;
const double EPS = 1e-;
const double PI = acos(-1.0);
const LL mod = 1e9 + ;
const LL inf = 0x7fffffff;
const LL infLL = 0x7fffffffffffffffLL;
const LL ONE = ;
const int maxN = 1e7 + ; struct A{
int pos;
int cnt = ;
}; LL n, ret = infLL;
A a[maxN];
PLL ans; inline LL gcd(LL x,LL y){
LL t;
if(!(x && y))return -;
while(y){
t=x%y;
x=y;
y=t;
}
return x;
} inline LL lcm(LL x,LL y){
LL t = gcd(x,y);
if(t == -)return -;
return x/t*y;
} int main(){
INIT();
cin >> n;
For(i, , n) {
LL x;
cin >> x;
if(a[x].cnt == ) {
a[x].pos = i;
++a[x].cnt;
}
else if(a[x].cnt == ) {
if(x < ret) {
ret = x;
ans = MP(a[x].pos, i);
}
++a[x].cnt;
}
} // Enumerate common factor d
For(d, , maxN) {
LL x1 = ;
for(int x2 = d; x2 < maxN; x2 += d){
if(!a[x2].cnt) continue;
if(!x1) x1 = x2;
else{
// x1,x2为前2个有公因子d的数
if(gcd(x1, x2) == d){
LL tmp = x2 / d * x1;
if(tmp < ret){
ret = tmp;
ans = MP(a[x2].pos, a[x1].pos);
}
}
break;
}
}
} if(ans.ft > ans.sd) swap(ans.ft, ans.sd);
cout << ans.ft << " " << ans.sd;
return ;
}
Codeforces 1154G Minimum Possible LCM的更多相关文章
- Codeforces B. Minimum Possible LCM(贪心数论)
题目描述: B. Minimum Possible LCM time limit per test 4 seconds memory limit per test 1024 megabytes inp ...
- Minimum Sum LCM(uva10791+和最小的LCM+推理)
L - Minimum Sum LCM Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- UVA.10791 Minimum Sum LCM (唯一分解定理)
UVA.10791 Minimum Sum LCM (唯一分解定理) 题意分析 也是利用唯一分解定理,但是要注意,分解的时候要循环(sqrt(num+1))次,并要对最后的num结果进行判断. 代码总 ...
- Codeforces Round #552:G. Minimum Possible LCM
官方题解是时间复杂度为O(nd)的.这里给出一个简单实现但是时间复杂度为O(NlogN) (N=1e7) 因为 a*b/gcd(a,b)=lcm(a,b) 所以我们可以枚举每一个因子,然后找到存在这个 ...
- F - Minimum Sum LCM
LCM (Least Common Multiple) of a set of integers is defined as the minimum number, which is a multip ...
- UVA 10791 Minimum Sum LCM(分解质因数)
最大公倍数的最小和 题意: 给一个数字n,范围在[1,2^23-1],这个n是一系列数字的最小公倍数,这一系列数字的个数至少为2 那么找出一个序列,使他们的和最小. 分析: 一系列数字a1,a2,a3 ...
- codeforces 496A. Minimum Difficulty 解题报告
题目链接:http://codeforces.com/contest/496/problem/A 题目意思:给出有 n 个数的序列,然后通过删除除了第一个数和最后一个数的任意一个位置的数,求出删除这个 ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- Minimum Sum LCM UVA - 10791(分解质因子)
对于一个数n 设它有两个不是互质的因子a和b 即lcm(a,b) = n 且gcd为a和b的最大公约数 则n = a/gcd * b: 因为a/gcd 与 b 的最大公约数也是n 且 a/gcd ...
随机推荐
- php文件管理,能够点击依照时间,大小,名称排序
php文件管理.能够点击依照时间.大小,名称排序 本例没实用到jquery 演示 PHP Code <?php $rootdir="./"; $spacen ...
- django如何语法高亮模块
首先,django的语法高亮必须配合markdown模块使用. 注意事项: 确保在渲染文本时添加了 markdown.extensions.codehilite 拓展 确保安装了 Pygments. ...
- 关于NOIP2018复赛若干巧合的声明
关于NOIP2018复赛若干巧合的声明 导言 参加NOIP2018时本人学龄只有两个月,却斩获了省一等奖,保送了重点中学的重点班,这看上去是个我创造的神话,然而,在我自己心中,我认为这只是个巧合(其实 ...
- HTTP与HTTPS对访问速度(性能)的影响
1 前言 HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗. 本文主要介绍 https 对用户体验的影响. ...
- D. Artsem and Saunders
一个变换题 给定f(x),[1,n]->[1,n] 构造g(x),h(x)满足: g(h(x))=x [1,n]->[1,m] h(g(x))=f(x) [1,m]->[1,n] 根 ...
- WebBench压力测试工具(详细源码注释+分析)
本文适合人群:对WebBench实现感兴趣的人 WebBench原理: Linux下使用的服务器压力测试工具,利用fork建立多个子进程,每个子进程在测试时间内不断发送请求报文,建立多个连接,然后由父 ...
- 关于 js tofixed()保留小数位数问题
保留位数必须是数字 const num = parseFloat ('123456.33').tofixed(2); !!!! 注意 现在的的 num 是 字符串类型, 如果给它加数字的话,就会报错 ...
- redis底层设计(五)——内部运作机制
5.1 数据库 5.1.1 数据库的结构: Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示: typedef struct redisDb { // 保存着数据库以整数表 ...
- CSS的插入和选择器介绍
一.认识CSS样式 1.定义 CSS全称:层叠样式表(Cascading Style Sheets) 主要作用:定义HTML内容在浏览器内的显示样式,比如文字大小.颜色.字体加粗等 优点:通过定义某个 ...
- mybatis源码- 反射模块一(跟着MyBatis学反射):类级别信息的封装
目录 1 JavaBean 规范 2 Reflector和ReflectorFactory 2.1 Reflector 属性 2.1.1 属性 2.1.2 Invoker 接口 2.2 Reflect ...