区间LCM

来源:互联网 发布:安卓富文本编辑器源码 编辑:程序博客网 时间:2024/06/05 01:13
一个整数序列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值。
Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5每组测试数据有相同的结构构成:每组数据一行一个整数N,1<=N<=1000000。
Output
每组数据一行输出,即M的最小值。
Input示例
3123
Output示例
246
#include <cstring>#include <iostream>#include <vector>using namespace std;const int MAXN = 1e6 + 5;vector<int> primes;int T;bool buf[MAXN];void calPrime(){memset(buf, true, sizeof(buf));buf[0] = false;buf[1] = false;for (int i = 2; i < MAXN; i++){if (buf[i]){primes.push_back(i);for (int j = 2*i; j < MAXN; j += i){buf[j] = false;}}}}int main(){calPrime();cin >> T;for (int i = 0; i < T; i++){int n;cin >> n;int j = 0;int result = 1;while (primes[j] <= n){for (int k = primes[j]; k <= n; k *= primes[j]){result = max(result, k);}j++;}cout << 2*result << endl;}return 0;}


原创粉丝点击