|
发表于 2020-5-1 12:11:59
|
显示全部楼层
本帖最后由 guosl 于 2022-9-1 20:02 编辑
- /*
- 答案:18613426663617118
- 耗时:9.44929 (AMD 5600G)
- */
- #include <iostream>
- #include <vector>
- #include <cstring>
- #include <cmath>
- #include <omp.h>
- using namespace std;
- char cp[1002004];//记录1000000以下的素数位置
- vector<int> vp; //记录1000000以下的素数
- int main(void)
- {
- //应用筛法求出素数的位置
- memset(cp, 1, sizeof(cp));
- cp[0] = 0;
- cp[1] = 0;
- for (int i = 2; i <= 1001; ++i)
- {
- if (cp[i] == 0)
- continue;
- for (int j = i * i; j <= 1002001; j += i)
- cp[j] = 0;
- }
- //记录素数
- for (int i = 5; i <= 1002001; ++i)
- {
- if (cp[i] == 1)
- vp.push_back(i);
- }
- //求出1000000以下的素数个数
- int nK = (int)vp.size() - 1;
- while (vp[nK] > 1000000)
- --nK;
- unsigned long long nS = 0;
- #pragma omp parallel for firstprivate(nK) shared(vp) reduction(+:nS) schedule(dynamic,18)
- for (int i = 0; i <= nK; ++i)//枚举连续的素数对
- {
- int p1 = vp[i], p2 = vp[i + 1];
- //求出p1的位数
- int b = 1, nTemp = p1;
- while (nTemp != 0)
- {
- b *= 10;
- nTemp /= 10;
- }
- //求出最小满足条件的数
- unsigned long long y = p2 - p1;
- while ((y % b) != 0)
- {
- y += p2;
- }
- nS += y + p1;
- }
- cout << nS << endl;
- return 0;
- }
复制代码 |
|