Libreoj #6165. 一道水題 (快速線性篩素數)
阿新 • • 發佈:2019-02-08
題意:求出能整除[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; }