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: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...
随机推荐
- C#秘密武器之多线程——参数与返回值
线程函数要么没有参数,要么只能有一个object参数,而且均没有返回值,这样就大大降低了程序的灵活性,其实我们想要的是能像普通方法一样正常使用参数和返回值!能不能实现这个需求呢?下面就介绍两种方法 一 ...
- python版本管理--pyenv
python版本环境管理 下载依赖 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readli ...
- 12-spring学习-基本表达式
基本表达式 一,字面表达式 二,数学表达式 三,关系表达式 四,字符串表达式 String类中所有操作方法都是开发过程中最常用的. 五,正则表达式
- SSH限制ip登陆
linux限制IP访问ssh 在/etc/hosts.allow输入 (其中192.168.10.88是你要允许登陆ssh的ip,或者是一个网段192.168.10.0/24) sshd: ...
- 欧洲顶级音频播放软件AIMP
http://zmingcx.com/europes-top-software-aimp-audio-player.html 音频播放软件众多,耳熟能详的Winamp.Foobar2000.千千静听. ...
- bootstrap 网格系统学习
Bootstrap 官方文档中有关网格系统的描述: Bootstrap 包含了一个响应式的.移动设备优先的.不固定的网格系统,可以随着设备或视口大小的增加而适当地扩展到 12 列.它包含了用于简单的布 ...
- canvas学习笔记(上篇)-- canvas入门教程 -- canvas标签/方块/描边/路径/圆形/曲线
[上篇] -- 建议学习时间4小时 课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...
- php对二维数据进行排序
PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义. 方法一:(经验证,成功) 作用:对二维数组进行指定key排序 参数:$arr ...
- unity, access sprite of UGUI Image
首先需要using UnityEngine.UI; 然后调用下面语句就不报错了: Image.GetComponent<Image>().sprite 参考:http://answers. ...
- AspNet GridView Excel 下载 Excel 导出
1.GridView AutoGenerateColums =false; DataSource DataBind 2.BoundField DataField HeaderText ItemStyl ...