Prime triplets (Project Euler 196)
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/ 。 没什么思维量,积累一个区间筛法模板。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int mod = 1e9 + ; char* isPrime;
LL bias; vector<LL> eratosthenesOddSingleBlock(LL from, LL to)
{
vector<LL> primes;
if (from > to || to <= ) return primes;
if (to == )
{
primes.push_back();
return primes;
}
if (!(from & )) ++from;
if (from > to) return primes; if (from <= ) primes.push_back(), from = ;
const int memorySize = (to - from) / + ;
char* isPrime = new char[memorySize]; for (int i = ; i < memorySize; i++)
isPrime[i] = ;
for (LL i = ; i*i <= to; i+=)
{
if (i >= * && i % == )
continue;
if (i >= * && i % == )
continue;
if (i >= * && i % == )
continue;
if (i >= * && i % == )
continue;
if (i >= * && i % == )
continue;
LL minJ = ((from+i-)/i)*i;
if (minJ < i*i)
minJ = i*i;
if ((minJ & ) == )
minJ += i;
for (LL j = minJ; j <= to; j += *i)
{
int index = j - from;
isPrime[index/] = ;
}
} for (int i = ; i < memorySize; i++)
if (isPrime[i]) primes.push_back(from + *i); delete[] isPrime;
return primes;
} bool checkPrime(LL val)
{
return isPrime[val - bias];
} inline LL getNumber(int r, int c)
{
return 1LL * (r - ) * r / + c;
} bool checkCentre(int r, int c)
{
if (c < || c > getNumber(r, c) || !checkPrime(getNumber(r, c))) return false;
int cnt = , x, y;
for (int dx = -; dx <= ; ++dx)
{
for (int dy = -; dy <= ; ++dy)
{
x = r + dx;
y = c + dy;
if (y < || y > x) continue;
cnt += checkPrime(getNumber(x, y));
if (cnt >= ) return true;
}
}
return false;
}
bool check(int r, int c)
{
for (int dx = -; dx <= ; ++dx)
for (int dy = -; dy <= ; ++dy)
if (checkCentre(r + dx, c + dy))
return true;
return false;
} LL solve(int row)
{
if (row == ) return ;
if (row <= ) return ; LL l = getNumber(row - , ), r = getNumber(row + , row + );
vector<LL> primes = eratosthenesOddSingleBlock(l, r);
isPrime = new char[r - l + ];
memset(isPrime, , r - l + );
bias = l;
for (auto p: primes) isPrime[p - bias] = ; pair<int, int> pos;
LL res = , val = getNumber(row, );
for (int col = ; col <= row; ++col)
{
if (checkPrime(val) && check(row, col))
res += val;
++val;
}
return res;
} int main()
{
//freopen("out.txt", "w" , stdout); int a, b;
cin >> a >> b;
cout << solve(a) + solve(b) << endl; return ;
}
Prime triplets (Project Euler 196)的更多相关文章
- Python练习题 035:Project Euler 007:第10001个素数
本题来自 Project Euler 第7题:https://projecteuler.net/problem=7 # Project Euler: Problem 7: 10001st prime ...
- Python练习题 031:Project Euler 003:最大质因数
本题来自 Project Euler 第3题:https://projecteuler.net/problem=3 # Project Euler: Problem 3: Largest prime ...
- [project euler] program 4
上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Project Euler 9
题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...
- project euler 169
project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...
- 【Project Euler 8】Largest product in a series
题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...
- Project Euler 第一题效率分析
Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
随机推荐
- MyEclipse 集成 Gradle开发环境
一.上Grandle官网下载Gradle,地址:http://www.gradle.org/downloads 如果只是运行只下载gradle-2.6-bin.zip 就可以了,如果为了扩展开发的话就 ...
- iOS 证书管理.p12文件不能导出
iOS证书不能导出p12文件: 首先要确认证书是从你这个电脑上制作生成的! 钥匙串-->我的证书--->右键,就可以导出了!
- 算法笔记_158:算法提高 逆序排列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存 ...
- webDriver API——第12部分WebElement
class selenium.webdriver.remote.webelement.WebElement(parent, id_) Bases: object Represents a DOM el ...
- PHP中is_*() 函数用法
PHP中is_*() 函数用法 is_a - 如果对象属于该类或该类是此对象的父类则返回 TRUE is_array - 检测变量是否是数组 is_bool - 检测变量是否是布尔型 is_calla ...
- win64 QT(VS2013) 配置 CGAL+libQGLViewer
网上讲的都不是太全 我来说说把~ 首先感谢这位大神: chenwk891:http://blog.csdn.net/chenwk891/article/details/42171495#reply 还 ...
- Android so文件生成
http://blog.csdn.net/laczff21/article/details/7542236 http://blog.csdn.net/yhm2046/article/details/8 ...
- maven modules
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
- 解决 TextMate 2 无法安装 Emmet 插件
本篇文章由:http://xinpure.com/solving-textmate-2-cannot-install-emmet-plugin/ 前端神器 Emmet 插件原名为 ZedCoding ...
- 原装Win8系统换win7系统(图文教程)
装Win8系统换win7系统(图文教程) 在这几天小编发现到,很多用户在使用装机助理制作的U盘进行win8系统换win7系统时总是失败,搞得人心惶惶的.有些用户以为在制作好U盘启动后放进需要装的系统就 ...