蓝桥杯题目
试题 B: 双子数
本题总分:5 分
【问题描述】
若一个正整数 x 可以被表示为 p2 × q2,其中 p、q 为质数且 p , q,则 x 是一个 “双子数”。请计算区间 [2333, 23333333333333] 内有多少个 “双子数”?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
欧拉筛模版
//欧拉筛
const int N = 1e7+10;
int notprime[N] = { 1,1 };//0,1都不是素数,一一对应关系
vector<int> prime;//用一个vector记录素数,push_back好扩容且范围for不用担心下标问题void GetPrime(int n)
{for (int i = 2; i <= n; i++){if (!notprime[i])prime.push_back(i);//没被筛过就是素数//for (int j = 0; j < prime.size() && prime[j] * i <= N; j++) {// notprime[prime[j] * i] = 1;//标记以i为最大因数的数为不是素数(除了1和本身)// if (i % prime[j] == 0) {//如果p[j]是i的因数,那么后面的数都不是以i为最大因数的 // break;// }//}for (auto p : prime){if (i * p > n)break;notprime[i * p] = 1;if (i % p == 0)//关键点保证o(n)复杂度break;}}
}
题目解析
暴力枚举
int main()
{GetPrime(1e7);/*for (auto e : prime)cout << e << " ";*/long long l = 2333, r = 23333333333333;long long ans = 0;for (int i = 0; i < prime.size(); i++){for (int j = i + 1; j <prime.size(); j++){long long p1 = prime[i];long long p2 = prime[j];if (p1 * p1 * p2 * p2 < l)continue;if (p1 * p1 * p2 * p2>r)break;ans++;}}cout << ans;return 0;}