题目
一个整数序列S的LCM(最小公倍数)是指最小的正整数X使得它是序列S中所有元素的倍数,那么LCM(S)=X。
例如,LCM(2)=2,LCM(4,6)=12,LCM(1,2,3,4,5)=60。
现在给定一个整数N(1<=N<=1000000),需要找到一个整数M,满足M>N,同时LCM(1,2,3,4,...,N-1,N) 整除 LCM(N+1,N+2,....,M-1,M),即LCM(N+1,N+2,....,M-1,M)是LCM(1,2,3,4,...,N-1,N) 的倍数.求最小的M值。
收起
输入
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5 每组测试数据有相同的结构构成: 每组数据一行一个整数N,1<=N<=1000000。
输出
每组数据一行输出,即M的最小值。
输入样例
3 1 2 3
输出样例
2 4 6
解题思路:考虑lcm(a,b),对a,b做唯一分解则,那么对lcm(a,b)做唯一分解。那么对于lcm(1,2,...n),很明显对于每个素数我们需要找出满足中k的最大值。那么,我们要使得,则应该包括所有的倍数,为了保证m最小,所以。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6;
int prime[maxn],mark[maxn];
int table[maxn],tot = 1;
void gettable(){
for(int i = 2;i < maxn;++i){
if(!mark[i]) prime[++prime[0]] = i;
for(int j = 1;j <= prime[0] && i * prime[j] < maxn;++j){
mark[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
table[0] = 1;
for(int i = 1;i <= prime[0];++i){
ll tmp = prime[i];
for(;tmp <= maxn;){
table[tot++] = tmp;
tmp *= prime[i];
}
}
sort(table,table + tot);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
int T,N;
gettable();
cin>>T;
while(T--){
cin>>N;
cout<< table[lower_bound(table,table + tot,N + 1) - table - 1] * 2 << endl;
}
return 0;
}