1. 程式人生 > >Libreoj #6165. 一道水題 (快速線性篩素數)

Libreoj #6165. 一道水題 (快速線性篩素數)

題意:求出能整除[1,n]中所有數的最小整數,對100000007取模。(注意是1e8+7!!!)

思路:首先用線性篩篩出[1,n]的所有素數,記為p[i]。答案是對每個p[i],求出最大的p[i]^k,滿足p[i]^k<=n。把所有這些p[i]^k乘起來就是答案。

之前一直用的是一般的素數篩選法,在這會T,要用快速線性篩

程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn = 100000004;
const int mod = 1e8+7;
int n, cnt, p[6200000];
bool vis[maxn];

int main(void)
{
    scanf("%d", &n);
    ll ans = 1;
    for(int i = 2; i <= n; i++)
    {
        if(!vis[i])
        {
            p[cnt++] = i;
            for(ll s = i; s <= n; s *= i)
                ans = ans*i%mod;
        }
        for(int j = 0; j < cnt; j++)
        {
            ll v = i*p[j];
            if(v > n) break;
            vis[v] = 1;
            if(i%p[j] == 0) break;
        }
    }
    printf("%lld\n", ans);
    return 0;
}