题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1226
题目:https://projecteuler.net/problem=291
题意:如果质数可以由如下公式构造出来,那么称质数是可造的。
给定一个区间,求在这个区间内有多少个可造的质数,其中。
分析:把原式进行化简得到
设,,且有和,那么继续得到
很明显。那么得到
继续化简得到
由于是素数,那么,且,最终得到
接下来,可以利用Brahmagupta–Fibonacci identity原理进行筛选。
最后附论文一篇:http://ami.ektf.hu/uploads/papers/finalpdf/AAPASM_25_from39to53.pdf
代码:
#include
#include
#include
#include
using namespace std;
typedef long long LL;
LL Solve(LL a, LL b)
{
vector v;
for(LL i = 0; ;i++)
{
LL t = 2 * i * i + 2 * i + 1;
if(t > b) break;
v.push_back(t);
}
int cnt = 0;
for(LL i = 1; i < v.size(); i++)
{
LL t = 2 * i * i + 2 * i + 1;
LL x = v[i];
if(t == x && t >= a)
cnt++;
if(x > 1)
{
for(int j = i; j < v.size(); j += x)
while(v[j] % x == 0)
v[j] /= x;
for(int j = x - i - 1; j < v.size(); j += x)
while(v[j] % x == 0)
v[j] /= x;
}
}
return cnt;
}
int main()
{
LL a, b;
while(cin >> a >> b)
cout << Solve(a, b) << endl;
return 0;
}