求大佬解答
查看原帖
求大佬解答
519384
Link_Cut_Y楼主2022/3/28 10:16

数据范围是10910^9,如果直接求解肯定过不了

易得一个性质,如果pp大于等于109\sqrt{10^9}n>1n > 1,那么最终结果一定大于10910^9

所以,考虑对于数据进行特判处理。对于所有小于109\sqrt{10^9}pp进行处理

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

typedef long long LL;
const int N = 50010;
int n, p;
bool st[N];
int primes[N], cnt;
vector<int> res;
int start;

void get_primes(int n)
{
	for (int i = 2; i <= n; i ++ )
	{
		if (!st[i]) primes[ ++ cnt] = i;
		else continue;
		
		for (int j = i + i; j <= n; j += i)
			st[j] = true;
	}
}

void dfs(int s)
{
	for (int i = start; i <= cnt; i ++ )
	{
		if ((LL)s * primes[i] > 1e9) continue;
		res.push_back(s * primes[i]);
		dfs(s * primes[i]);
	}
}

int main()
{
	cin >> n >> p;
	
	if (p < 31623)
	{
		get_primes(31700);
		start = lower_bound(primes + 1, primes + cnt + 1, p) - primes;
		dfs(1);
		
		cout << (res[n - 1] <= 1e9 ? res[n - 1] : 0) << endl;
	}
	else if (n == 1) cout << p << endl;
	else cout << 0;
	
	return 0;
}
2022/3/28 10:16
加载中...