51nod 1434

首先可以得出一个性质: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\n", ans);
    }
    return 0;
}

 

posted @ 2018-08-31 10:42  xayata  阅读(370)  评论(0编辑  收藏  举报