这道题需要我们筛选大量素数,我们可以得知如果直接枚举时间会超限,因此我们可以用欧拉筛法来进行筛选素数,我们可以用一个数组来存储所有素数,第一个素数肯定是2,然后我们可以将2的倍数都筛掉,然后就是3,再把3的倍数都筛掉,当遇到2,3共同倍数的时候,就跳出,经过筛选后,我们就可以直接用枚举将所有可行的方案列举出来,再进行输出即可,由于数据很大,因此我们需要开longlong类型防止爆掉

上代码

#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long//开int防止爆掉

using namespace std;

const int N = 1e7;
int prime[N], cnt = 0;
bool st[N] = { 0 };

void get_prime(int n)//筛数 
{
	for (int i = 2; i <= n; i++) {
		//如果没有被筛选过,那么就是素数 
		if (!st[i]) prime[cnt++] = i;
		//枚举每一个素数
		for (int j = 0; prime[j] <= n / i; j++) {
			//将素数的倍数都筛选掉
			st[prime[j] * i] = true;

			if (i % prime[j] == 0) break;
		}
	}
	return;
}

signed main(void)
{
	get_prime(N);
	int l = 2333, r = 23333333333333;
	int ans = 0;
	for (int i = 0; i < cnt; i++) {
		if (prime[i] * prime[i] * prime[i + 1] * prime[i + 1] > r) break;
		for (int j = i + 1; j < cnt; j++) {
			int p1 = prime[i], p2 = prime[j];
			if (p1 * p1 * p2 * p2 < l) continue;
			if (p1 * p1 * p2 * p2 > r) break;
			ans++;
		}
	}

	cout << ans << endl;

	return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐