#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int s[N];
int n, a, b, k;
int xx (int x)
{
if (x == 1) return 0;
if (x == 2) return 1;
if ((x & 1) == 0) return 0;
for (int i = 3; i <= sqrt(x); i ++ )
{
if (x % i == 0) return 0;
}
return 1;
}
bool check (int x)
{
for (int i = x; i <= n; i ++ )
{
if (s[i] - s[i - x] < k) return false;
}
return true;
}
int main ()
{
cin >> a >> b >> k;
n = b - a + 1;
for (int i = a; i <= b; i ++ )
{
if (xx(i)) s[i - a + 1] = 1;
s[i - a + 1] += s[i - a];//前缀法,计算出区间素数个数
}
if (s[n] < k)
{
puts("-1");
return 0;
}
int l = 0, r = n;
while (l < r)
{
int mid = (l + r) >> 1;
if (check(mid)) r = mid-1;
else l = mid + 1;
}
cout << l;
return 0;
}
题目链接(前缀法加二分法)