问题描述
Torry从小喜爱数学,一天,老师告诉他,像 2、3、5、7……这样的数叫做质数。
Torry突然想到一个问题,前10、100、1000、10000……个质数的乘积是多少呢?
他把这个问题告诉老师,老师愣住了。
一时回答不出来,于是Torry求助于会编程的你,请你算出前 n 个质数的乘积。
不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值。
输入格式
仅包含一个正整数 n,其中 n ≤ 100000。
输出格式
输出一行,即前 n 个质数的乘积模 50000 的值。
样例输入
1
样例输出
2
题解
埃氏筛法:
1 ~ x 的质数个数
:
f
[
x
]
≈
x
l
n
x
f[x]≈ \frac{x}{lnx}
f[x]≈lnxx
#include <iostream>
using namespace std;
const int N = 2000010, mod = 50000;
bool flag, st[N];
int n, k, prime[N];
int main()
{
cin >> n;
for (int i = 2; i <= N; i ++)
if(!st[i] && !flag)
{
prime[k ++] = i % mod;
if(k == n) flag = true;
for (int j = i + i; j <= N; j += i) st[j] = true;
}
long long ans = 1;
for (int i = 0; i < k; i ++) ans = ans * prime[i] % mod;
cout << ans << endl;
return 0;
}
ps:算法训练里叫 “基本型”,算法提高里叫 “提高型”,关键题目还是完全一样的😒