original version

hackerrank programming version

题目大意是定义了一个正整数的表,第一行是1,第二行是1,2,第三行1,2,3...定义prime triple是在表上八连通的三个质数。然后问某行有多少个质数至少在一个prime triple中。   行数 <= 1e7.

题解:

假设要求第n行的答案,只要把上2行和下2行的数都抠出来,然后判断一下就好了。问题转化为求[L,R]之间的质数,这里5行数,区间长度大概有5e7,所以要用modified 区间筛法。 参考 http://euler.stephan-brumme.com/196/ 。 没什么思维量,积累一个区间筛法模板。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3
  4 typedef long long LL;
  5 const int mod = 1e9 + 7;
  6
  7 char* isPrime;
  8 LL bias;
  9
 10 vector<LL> eratosthenesOddSingleBlock(LL from, LL to)
 11 {
 12     vector<LL> primes;
 13     if (from > to || to <= 1) return primes;
 14     if (to == 2)
 15     {
 16         primes.push_back(2);
 17         return primes;
 18     }
 19     if (!(from & 1)) ++from;
 20     if (from > to) return primes;
 21
 22     if (from <= 2) primes.push_back(2), from = 3;
 23     const int memorySize = (to - from) / 2 + 1;
 24     char* isPrime = new char[memorySize];
 25
 26
 27     for (int i = 0; i < memorySize; i++)
 28         isPrime[i] = 1;
 29     for (LL i = 3; i*i <= to; i+=2)
 30     {
 31       if (i >= 3*3 && i % 3 == 0)
 32          continue;
 33       if (i >= 5*5 && i % 5 == 0)
 34          continue;
 35       if (i >= 7*7 && i % 7 == 0)
 36          continue;
 37       if (i >= 11*11 && i % 11 == 0)
 38          continue;
 39       if (i >= 13*13 && i % 13 == 0)
 40          continue;
 41       LL minJ = ((from+i-1)/i)*i;
 42       if (minJ < i*i)
 43           minJ = i*i;
 44       if ((minJ & 1) == 0)
 45           minJ += i;
 46       for (LL j = minJ; j <= to; j += 2*i)
 47       {
 48           int index = j - from;
 49           isPrime[index/2] = 0;
 50       }
 51     }
 52
 53     for (int i = 0; i < memorySize; i++)
 54            if (isPrime[i]) primes.push_back(from + 2*i);
 55
 56     delete[] isPrime;
 57     return primes;
 58 }
 59
 60
 61 bool checkPrime(LL val)
 62 {
 63     return isPrime[val - bias];
 64 }
 65
 66 inline LL getNumber(int r, int c)
 67 {
 68     return 1LL * (r - 1) * r / 2 + c;
 69 }
 70
 71 bool checkCentre(int r, int c)
 72 {
 73     if (c < 0 || c > getNumber(r, c) || !checkPrime(getNumber(r, c))) return false;
 74     int cnt = 0, x, y;
 75     for (int dx = -1; dx <= 1; ++dx)
 76     {
 77         for (int dy = -1; dy <= 1; ++dy)
 78         {
 79             x = r + dx;
 80             y = c + dy;
 81             if (y < 0 || y > x) continue;
 82             cnt += checkPrime(getNumber(x, y));
 83             if (cnt >= 3) return true;
 84         }
 85     }
 86     return false;
 87 }
 88 bool check(int r, int c)
 89 {
 90     for (int dx = -1; dx <= 1; ++dx)
 91         for (int dy = -1; dy <= 1; ++dy)
 92             if (checkCentre(r + dx, c + dy))
 93                return true;
 94     return false;
 95 }
 96
 97 LL solve(int row)
 98 {
 99     if (row == 1) return 0;
100     if (row <= 3) return 5;
101
102     LL l = getNumber(row - 2, 1), r = getNumber(row + 2, row + 2);
103     vector<LL> primes = eratosthenesOddSingleBlock(l, r);
104     isPrime = new char[r - l + 1];
105     memset(isPrime, 0, r - l + 1);
106     bias = l;
107     for (auto p: primes) isPrime[p - bias] = 1;
108
109     pair<int, int> pos;
110     LL res = 0, val = getNumber(row, 1);
111     for (int col = 1; col <= row; ++col)
112     {
113         if (checkPrime(val) && check(row, col))
114            res += val;
115         ++val;
116     }
117     return res;
118 }
119
120 int main()
121 {
122     //freopen("out.txt", "w" , stdout);
123
124     int a, b;
125     cin >> a >> b;
126     cout << solve(a) + solve(b) << endl;
127
128     return 0;
129 }

转载于:https://www.cnblogs.com/vb4896/p/9258846.html

Prime triplets (Project Euler 196)相关推荐

  1. Project Euler 3 Largest prime factor

    Project Euler 3 Largest prime factor ''' The prime factors of 13195 are 5, 7, 13 and 29. What is the ...

  2. [Project Euler] 来做欧拉项目练习题吧: 题目012

      [Project Euler] 来做欧拉项目练习题吧: 题目012 周银辉 问题描述: The sequence of triangle numbers is generated by addin ...

  3. 欧拉计划 Project Euler 50-56

    Project Euler 50-56 Project Euler: https://projecteuler.net/ Project Euler | 欧拉计划: https://pe-cn.git ...

  4. 硬币游戏 Project Euler 232

    原帖:http://hi.baidu.com/atyuwen/blog/item/160bd024531e3034c995591d.html Project Euler上最近的题目都还比较意思,来看看 ...

  5. [Project Euler] 来做欧拉项目练习题吧: 题目004

        [Project Euler] 来做欧拉项目练习题吧: 题目004 周银辉 问题描述: A palindromic number reads the same both ways. The l ...

  6. [Project Euler] 来做欧拉项目练习题吧: 题目017

    [Project Euler] 来做欧拉项目练习题吧: 题目017 周银辉 题目描述: If the numbers 1 to 5 are written out in words: one, two ...

  7. Project Euler

    最近发现了一个很有趣的网站,Project Euler 上面全是数学题,不过大多需要用编程解决 Problem 3: 求:600851475143的最大素因子. 解:编了个程序,迅速水过,看官方的题解 ...

  8. Project Euler Problem 27小结

    Project Euler上有很多有意思的问题,刚做到第27题,对这个问题做个小结. Problem 27: Euler有一个著名的方程n^2+n+41,当n=0到39时,方程结果均为质数.如今人们用 ...

  9. Project Euler Problem 104 Pandigital Fibonacci ends

    Pandigital Fibonacci ends Problem 104 The Fibonacci sequence is defined by the recurrence relation: ...

  10. Project Euler Problem 66

    Problem 66 Consider quadratic Diophantine equations of the form: x2 – Dy2 = 1 For example, when D=13 ...

最新文章

  1. rdf(资源描述框架)
  2. 微服务框架Go-Micro集成Nacos实战之服务注册与发现
  3. python面向对象进阶
  4. [Redis6]key键操作
  5. 思维构造——cf1090D
  6. OpenShift 4 - 使用Debezium实现MySQL的CDC变化数据捕获
  7. 【渝粤教育】国家开放大学2018年春季 0266-21T设计构成 参考试题
  8. 推荐:Windows平台上三款提高工作效率的免费神器!
  9. paip.验证码识别的意义
  10. 浅谈前端JavaScript编程风格
  11. php易宝支付扫码支付代码_刷脸支付将颠覆扫码支付——汇刷刷脸支付
  12. 深度学习(图像处理): A neural algorithm of artistic style算法详解
  13. C#里的InputBox
  14. STM32-端口复用和重映射
  15. 12f的接线 esp8266_ESP8266 系列最小系统版接线
  16. 网络共享计算机无法登录,局域网共享文件夹访问无法出现用户登陆窗口怎么办?...
  17. Python量化交易平台:JQData | API使用文档(转)
  18. 路由器角色 ABR ASBR
  19. 你们要的水性粘合剂乳胶漆消泡剂已经出来了
  20. Latex模板排版等相关设置

热门文章

  1. 【JZOJ3337】wyl8899的TLE【二分】【哈希】
  2. 简易学籍管理系统(3)--插入结点并排序
  3. cors数据类型_CORS账号和南方RTK连接怎样操作使用?步骤说明
  4. PS3主机今日发售 附官方问答
  5. 在线 excel 产品技术调研
  6. Unity3d调用Andriod
  7. 渗透工具SharpXDecrypt:Xshell全版本凭证一键恢复工具,针对Xshell全版本在本地保存的密码进行解密
  8. Oliver的救援(bfs)
  9. c语言char10是什么意思,c语言char是什么意思
  10. 高级计量经济学及stata应用 学习笔记③ 长面板