最小公倍数 SRM 661 Div1 250: MissingLCM
Problem Statement
The least common multiple (denoted "lcm") of a non-empty sequence of positive integers is the smallest positive integer that is divisible by each of them. For example, lcm(2)=2, lcm(4,6)=12, and lcm(1,2,3,4,5)=60.
Alice had a positive integer N. Then she chose some positive integer M that was strictly greater than N. Afterwards, she computed two values:
the value A = lcm(N+1, N+2,
..., M) and the value B = lcm(1, 2, ..., M). She was surprised when she saw that A = B.the value A = lcm(N+1, N+2,
..., M) and the value B = lcm(1, 2, ..., M). She was surprised when she saw that A = B.the value A = lcm(N+1, N+2,
..., M) and the value B = lcm(1, 2, ..., M). She was surprised when she saw that A = B.the value A = lcm(N+1, N+2,
..., M) and the value B = lcm(1, 2, ..., M). She was surprised when she saw that A = B.the value A = lcm(N+1, N+2,
..., M) and the value B = lcm(1, 2, ..., M).
You are given the int N. Find and return the smallest M Alice could have chosen. (Such an M will always exist.)
Definition
- ClassMissingLCM
- MethodgetMin
- Parametersint
- Returnsint
- Method signatureint getMin(int N)
Limits
- Time limit (s)2.000
- Memory limit (MB)256
Constraints
- N will be between 1 and 1,000,000, inclusive.
Test cases
- N1
Returns2
Alice needs to choose an M > 1 such that lcm(2,...,M) = lcm(1,...,M). We can see M=2 is the minimum value that works, since lcm(1,2) = lcm(2) = 2.- N2
Returns4
- N3
Returns6
We have lcm(4,5,6) = lcm(1,2,3,4,5,6) = 60.- N4
Returns8
- N5
Returns10
- N42
Returns82
Oh... that doesn't fit the pattern.- N999999
Returns1999966
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
In this problem the actual LCM values used can be notably large. It is best to avoid approaches that calculate them directly. Then how about we think of this problem in terms of the prime factorization of the numbers. For example, consider two numbers: 12 and
135. Their prime factorizations are: 22⋅3 and 33⋅5.
The prime factorization of the LCM will be: 22⋅33⋅5.
In other words, for each prime number , we take the maximum exponent of the prime number among the two numbers we are calculating the LCM for. How does this translate to the two LCMs used?A=LCM(N+1,N+2,...,M)
B=LCM(1,2,...,M)
A=BWe need to translate this into distinct conditions, one for each relevant prime number:
a=max(ep(N+1),ep(N+2),...,ep(M))
b=max(ep(1),ep(2),...,ep(M))
a=bWhere ep(x) is
the exponent of prime number p in
the prime factorization of x,
the maximum number of times you can repeatedly divide x by p.
In words we just want the maximum exponent of prime p among
all the factorizations between N+1 and M and
between 1 and M to
be equal. Try this:b=max(ep(1),ep(2),...,ep(N),ep(N+1),...,ep(M))
b=max(ep(1),ep(2),...,ep(N),max(ep(N+1),...,ep(M)))
b=max(ep(1),ep(2),...,ep(N),a)What happens here is we take advantage that the maximum operation is associative. This means max(a,b,c)=max(a,max(b,c))=max(max(a,b),c).
The useful thing to conclude about this: b≥a.
There's more:b=max(max(ep(1),ep(2),...,ep(N)),a)
c=max(ep(1),ep(2),...,ep(N))
b=max(c,a)We want a=b=max(c,a):
This means we want c≤a.
Note that c is
constant, as it's determined by the numbers between 1 and N.
So we just need to look for a value of M such
that the maximum exponent of p among N+1,N+2,...M is
greater than or equal to c.There must be a number x>N for
which ep(x)≥c,
this means that the exponent of p in
the prime factorization of x.
If we take the maximumep(i) for
all i between N+1,...,M,
the result would be at least c,
meaning that using M=x would
be correct. M=x+1 and
any Mgreater
than x would
also be correct. If we find the minimum M that
is valid for p,
then we can assume that all greater numbers will also be valid for p.
This minimum M will
be the smallest x>N for
which ep(x)≥c.Did you notice that in the examples it initially appears that the result is always 2N and
then the result seems to be smaller than 2N but
not far apart?There is a good explanation for this. c is
the maximum exponent of p for
some number less than or equal to N,
let's call that number m. 2m will
also have that exponent for p (unless p=2,
in which it will have an even larger exponent). Making 2m a
valid value for M.
If we pick M=2N,
we will guarantee that this happens for all relevant prime numbers. This is useful because it means we only need to search for xamong
numbers less than or equal to 2N.For each prime p,
there will be a distinct minimum valid M ,
we should pick the maximum out of all of them. This number will be valid for all primes we try. Note that when p>N,
any M>N will
be correct. Because when p>N , c is
zero, none of the numbers smaller than or equal to N will
be multiples of p,
so the maximum exponent will be 0. This means we only need to repeat this for all the prime numbers that are less than or equal to N.For each prime number we need to find c and
also find the minimum x such
that: ep(x)>c and N<x≤2N.
The final improvement we need is to notice that given p,
we only need to think in terms of numbers that are multiples of p.
For i≤N,
only values of i that
are multiples of pwill
have an exponent of p in
their prime factor, so only they are relevant for the calculation of c.
For i>N,
only multiples of p may
have an exponent larger than or equal to c.
In total we will try all the multiples of p less
than or equal to 2N.
This is repeated for each p<N.
The final number of steps needed is: 2N2+2N3+2N5+...+2NP where P is
the maximum prime that doesn't exceed N.
This number of steps is very good and the complexity would be similar to the Sieve of Eratosthenes'. A simple way to tell that complexity is O(NN−−√) :
For all P>2N−−−√, 2NP=1.
There are 2N−2N−−−√ such
values, this is O(N).
For the other O(N−−√) values
of p,
even if we assumed O(N) steps,
the total complexity would still be: O(N+NN−−√).
We are ready to implement this solution:vector<int> get_primes(int N)
{
// Sieve of Erathostenes to find all the necessary prime numbers:
vector<int> res;
vector<bool> composite(N + 1, false); for (int p = 2; p <= N; p++) {
if (! composite[p]) {
for (int i = p+p; i <= N; i += p) {
composite[i] = true;
}
res.push_back(p);
}
}
return res; } int get_exponent(int x, int p)
{
int r = 0;
while (x % p == 0) {
r++;
x /= p;
}
return r;
} int getMin(int N)
{
int res = 2;
// For each prime number <= N:
for (int p: get_primes(N) ) {
// first find the maximum exponent of p among numbers <= N
// (in the explanation , this max_exp is c)
int max_exp = 0;
int i = p;
while (i <= N) {
max_exp = std::max(max_exp, get_exponent(i,p) );
i += p;
}
// seek the minimum i such that get_exponent(i,p) >= max_exp:
while (get_exponent(i,p) < max_exp) {
i += p;
}
// the maximum for all ps is the result:
res = std::max(res, i);
}
return res;
}
最小公倍数 SRM 661 Div1 250: MissingLCM的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- topcoder srm 661 div1
problem1 link $N+1$到$M$ 之间的数字要包含所有1到$N$之间出现的质因子的最高幂即可. problem2 link 从第一个节点到第$N$个节点依次考虑.对于第$i$个节点来说, ...
- SRM 595 DIV1 250
挺简单的组合把. #include <cstdio> #include <cstring> #include <iostream> #include <vec ...
- SRM 594 DIV1 250
可能开始宿舍比较乱,思绪静不下来...想了大半个小时,终于确定了应该暴力+DP,然后写了枚举除数,和被除的版本..这样,还敲错了个字母,第一次提交还100多,修改提交还有75.多,最后想到,貌似不打对 ...
- TC SRM 593 DIV1 250
我只能说的亏没做,要不就挂0了.. 本来想四色定理,肯定4就可以的...然后准备爆,发现3的时候不好爆,又想了老一会,嗯,数据范围不小,应该不是暴力,直接找规律,貌似最大就是3,有一个3连块,输出3, ...
- TC SRM 593 DIV1 250(dfs)
这图最多3色就可以 搜2就行了 #include <iostream> #include<cstdio> #include<cstring> #include< ...
- Topcoder SRM 698 Div1 250 RepeatString(dp)
题意 [题目链接]这怎么发链接啊..... Sol 枚举一个断点,然后类似于LIS一样dp一波 这个边界条件有点迷啊..fst了两遍... #include<bits/stdc++.h> ...
- TopCoder SRM500 Div1 250 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
随机推荐
- C#基于SMTP协议和SOCKET通信,实现邮件内容和附件的发送,并可隐藏收件人
经过几天的努力,从完全不懂SMTP到折腾出个可以发送邮件内容和附件的DEMO.话少说,直接上代码. using System; using System.Collections.Generic; us ...
- socket listen参数中的backlog
服务器监听时,在每次处理一个客户端的连接时是需要一定时间的,这个时间非常的短(也许只有1ms 或者还不到),但这个时间还是存在的.而这个backlog 存在的意义就是:在这段时间里面除了第一个连接请求 ...
- php简单浏览目录内容
<?php $dir = dirname(__FILE__); $open_dir = opendir($dir); echo "<table border=1 borderCo ...
- myeclipse和eclipse的区别和联系,以及版本间的对应关系
Eclipse:IBM花了4千万美金来开发这个IDE(Integrated Development Environment).第一版1.0在2001年11月释出,随后逐渐受到欢迎.Eclipse已经成 ...
- AngularJS中自定义过滤器
AngularJS中为我们提供了一些内置的过滤器,这里列举一些自定义过滤器的场景. 自定义过滤器,不带参赛 //过滤 不带参赛 app.filter('ordinal', function () { ...
- 在ASP.NET MVC中实现本地化和全球化
在开发多语言网站时,我们可以为某种语言创建一个资源文件,根据浏览器所设置的不同语言偏好,让运行时选择具体使用哪个资源文件.资源文件在生成程序集的时候被嵌入到程序集. 本篇体验,在ASP.NET MVC ...
- TXMLDocument use case (Delphi)
Description This example illustrates the basic operations on an XML document. Code procedure CreateD ...
- function, new function, new Function
函数是JavaScript中很重要的一个语言元素,并且提供了一个function关键字和内置对象Function,下面是其可能的用法和它们之间的关系. 使用方法一: var foo01 = f ...
- Panorama和Pivot控件
Windows Phone提供了Panorama和Pivot这两种控件供用户横向切换导航的方式来显示具有内容比较相关的页面.本文主要对这两个控件进行描述,包括如何使用,以及一些最佳实践. 其中包括如下 ...
- NoSQL现状
经过了至少4年的激烈争论,现在是对NoSQL的现状做一个阶段性结论的时候了.围绕着NoSQL发生了如此之多的事情,以至于很难对其作出一个简单概括,也很难判断它达到了什么目标以及在什么方面没有达到预期. ...