思路:
埃氏筛代码如下:
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if(!st[i]) primes[cnt ++ ] = i;
for (int j = i * i; j <= n; j += i)
st[j] = true;
}
}
线性筛代码如下:
void get_primes(int n)
{
for (int i = 2; i <= n; i ++ )
{
if(!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[i * primes[j]] = true;
if(i % primes[j] == 0) break;
}
}
}
B - Sum of Consecutive Prime Numbers
思路:
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fast ios::sync_with_stdio(false), cin.tie(nullptr); cout.tie(nullptr)
#define mkpr make_pair
#define endl '\n'
#define x first
#define y second
#define int long long
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
const int N = 10010, M = N * 2;
const int YB = 8, YM = 1e8;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int T, cases;
int n, m, times;
int primes[N], cnt;
bool st[N];
void get_primes(int n)
{
for (int i = 2; i <= N; i ++ )
{
if(!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[i * primes[j]] = true;
if(i % primes[j] == 0) break;
}
}
}
void solve()
{
int res = 0;
int sum = 0;
for (int l = 0, r = 0; primes[r] <= n; r ++ )
{
sum += primes[r];
while(sum > n)
{
sum -= primes[l];
l ++;
}
if(sum == n) res ++;
}
cout << res << endl;
return;
}
signed main()
{
get_primes(N);
T = 1;
//fast;cin >> T;
//scanf("%d", &T);
//for (cases = 1; cases <= T; cases ++ )
while(cin >> n, n)
solve();
return 0;
}
注意:
思路:
具体实现:
h数:所有模5余1的数H-semi-primes(H半质数)为 a * b其中a b为h素数h素数:在h范围内,除了1和 该数本身外无法被其他h数整除的数(也可定义为只有1与该数本身两个正因数的h数),与自然素数定义很像自然素数:指在大于1的自然数的范围内,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的自然数)h素数只不过为范围为h数的素数,h数的范围内做线性筛,即可求出所有的h数;同时,筛h素数时,若两个数都为h素数,则a * b为H-semi-primes(H半质数)代码如下(和线性筛一模一样):
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define fast ios::sync_with_stdio(false), cin.tie(nullptr); cout.tie(nullptr)
#define mkpr make_pair
#define endl '\n'
#define x first
#define y second
#define int long long
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
const int N = 1e6 + 10, M = N * 2;
const int YB = 8, YM = 1e8;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int T, cases;
int n, m, times;
int primes[N], cnt;
bool st[N];
bool Hprimes[N];
int ans[N];
void get_primes(int n)
{
for (int i = 5; i <= n; i += 4 )
{
if(!st[i]) primes[cnt ++ ] = i;
for (int j = 0; primes[j] <= n / i; j ++ )
{
st[i * primes[j]] = true;
// st[primes[j]] = true 所以只判断st[i]是否为 h素数即可
if(!st[i]) Hprimes[i * primes[j]] = true;
if(i % primes[j] == 0) break;
}
}
for (int i = 1; i <= N; i ++ )
{
if(Hprimes[i]) ans[i] = ans[i - 1] + 1;
else ans[i] = ans[i - 1];
}
}
void solve()
{
cout << n << " " << ans[n] << endl;
return;
}
signed main()
{
get_primes(N);
T = 1;
//fast;cin >> T;
//scanf("%d", &T);
//for (cases = 1; cases <= T; cases ++ )
while(cin >> n, n)
solve();
return 0;
}