Thuật toán:
- Dùng sàn erastosthen sinh các số nguyên tố trong khoảng từ 1..b +10.
- Tính số lượng các số nguyên tố từ 1 đến i : f[i] += f[i-1].
- Dùng tìm kiếm nhị phân tìm kết quả nhỏ nhát thỏa mãn.
#include<cstdio>
#include<iostream>
using namespace std;
int p[2200051];
int a,b,k;
void Prime();
int main()
{
freopen("TEST.INP","r",stdin);
freopen("TEST.OUT","w",stdout);
cin >> a >> b >> k;
Prime();
int res = -1;
int lo = 0, hi = (b - a + 2);
while(lo < hi)
{
int mid = (lo + hi) >> 1;
int find = 1;
for(int x = a - 1; find && x + mid <= b; x++ )
if(p[x + mid] - p[x] < k) find = 0;
if(find)
{
hi = mid;
}
else
{
lo = mid + 1;
}
}
cout << (lo > (b - a + 1) ? -1 : lo) << endl;
return 0;
}
void Prime()
{
for(int i = 2; i <= b + 10; i++) p[i] = 1;
for(int i = 2; i <= b + 10; i++)
{
if(p[i]==0) continue;
if(p[i]==1)
{
for(int j = i + i; j <= b + 10; j+=i) p[j] = 0;
}
}
for(int i = 1; i <= b + 10; i++) p[i] += p[i - 1];
}
Không có nhận xét nào:
Đăng nhận xét