K Simple question (第十屆山東理工大學ACM網路程式設計擂臺賽 正式賽)
阿新 • • 發佈:2018-11-19
題解:素數篩+唯一分解定理
可以把素數篩那部分放到while之外,減小時間複雜度。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <assert.h> const int maxn = 110000005; const int mod = 100000007; const int N = 60000008; int prime[N]; bool vis[maxn]; int main() { int n; while(~scanf("%d",&n)){ assert(1 <= n && n <= 100000000); long long ans = 1; int cnt=0; memset(vis,false, sizeof(vis)); for (int i = 2; i <= n; i++) { if (!vis[i]) { prime[cnt++] = i; for (long long j = i; j <= n; j *= i) { ans = ans * i % mod; } } for (int j = 0; j < cnt; j++) { long long x = i * prime[j]; if (x > n)break; vis[x] = true; if (i%prime[j] == 0)break; } } printf("%lld\n",ans); } return 0; }