演算法訓練 Torry的困惑(基本型) (預處理)
阿新 • • 發佈:2019-01-04
時間限制: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;
}