首先可以得出一个性质:LCM(1,2,3,4,...,N-1,N) 中质因子k的出现的次数为t,则有k^t<=n
根据这个性质我们先筛出素数,然后枚举每个质数,求出对应的k和t,然后找出倍数j(不会很大)
,使得j*k^t>n,这个j*k^t是ans的可能取值,所以ans = max(ans, j*k^t)不断更新最大的ans,
这样可以保证尽量小的m使得LCM(N+1,N+2,....,M-1,M)中存在j*k^t把LCM(1,2,3,4,...,N-1,N)中k^t除尽
#include <bits/stdc++.h> using namespace std; template<class T> T sqr(T x) { return x * x; } template<class T> T gcd(T a, T b) { return b ? gcd(b, a%b) : a; } template<class T> void read(T&num) { char CH; bool F=false; for(CH=getchar(); CH<'0'||CH>'9'; F= CH=='-',CH=getchar()); for(num=0; CH>='0'&&CH<='9'; num=num*10+CH-'0',CH=getchar()); F && (num=-num); } const int N=1e6+10; int n; int prime[N]; void init() { for(int i = 2; i * i < N; i++)if(!prime[i]) { for(int j = 2 * i; j < N; j += i)prime[j] = 1; } } int main() { int T; read(T); init(); while(T--) { read(n); int ans = 2, num; for(int i = 2; i <= n; i++)if(!prime[i]) { //素数 int u = (int)(log(n) / log(i)); int v = (int)pow(i, u); for (int j = 2; ; ++j)if (v * j > n) { v *= j; break; } ans = max(ans, v); } printf("%d ", ans); } return 0; }