题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1226
题意:如果质数可以由如下公式构造出来,那么称质数
是可造的。
给定一个区间,求在这个区间内有多少个可造的质数
,其中
。
分析:把原式进行化简得到
设,
,且有
和
,那么继续得到
很明显。那么得到
继续化简得到
由于是素数,那么
,且
,最终得到
接下来,可以利用Brahmagupta–Fibonacci identity原理进行筛选。
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <vector> using namespace std; typedef long long LL; LL Solve(LL a, LL b) { vector<LL> 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; }
原文:http://blog.csdn.net/acdreamers/article/details/41864569