蓝桥杯填空题:双子数
·

这道题需要我们筛选大量素数,我们可以得知如果直接枚举时间会超限,因此我们可以用欧拉筛法来进行筛选素数,我们可以用一个数组来存储所有素数,第一个素数肯定是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;
}
更多推荐


所有评论(0)