1. 程式人生 > >演算法訓練 Torry的困惑(基本型) (預處理)

演算法訓練 Torry的困惑(基本型) (預處理)

時間限制:1.0s 記憶體限制:512.0MB
提交此題
問題描述
  Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多少呢?他把這個問題告訴老師。老師愣住了,一時回答不出來。於是Torry求助於會程式設計的你,請你算出前n個質數的乘積。不過,考慮到你才接觸程式設計不久,Torry只要你算出這個數模上50000的值。
輸入格式
  僅包含一個正整數n,其中n<=100000。
輸出格式
  輸出一行,即前n個質數的乘積模50000的值。
樣例輸入
1

樣例輸出
2

分析: 預處理

#include <cstdio>
#include <vector> #include <cstring> #include <string> #include <map> #include <set> #include <cctype> #include <sstream> #include <iostream> #include <algorithm> using namespace std; #define mem(a,n) memset(a,n,sizeof(a)) #define rep(i,a,b) for(int i=a;i<b;i++)
#define pb push_back typedef long long ll; const int MOD=50000; const int N=2e6+5; int prime[N]; bool is_pr[N]; int cnt; void sieve() { cnt=0; mem(is_pr,0); for(int i=2; i*i<=N; i++) if(!is_pr[i]) for(int j=i*i; j<=N; j+=i) is_pr[j]=1; for(int i=2
; i<N; i++) if(!is_pr[i]) prime[cnt++]=i; } ll num,ans[100005];///可能超出int範圍 void init() { num=0; ans[0]=1; for(int i=1;i<100001;i++) ans[i]=(ans[i-1]*prime[i-1])%MOD; } int main() { sieve(); init(); int n; while(~scanf("%d",&n)) printf("%I64d\n",ans[n]); return 0; }