首页 > 代码库 > 3998 - Prime k-tuple
3998 - Prime k-tuple
{p1,..., pk : p1 < p2 <...< pk} is called a prime k -tuple of distance s if p1, p2,..., pk are consecutive prime numbers and pk - p1 = s . For example, with k = 4 , s = 8 , {11, 13, 17, 19} is a prime 4-tuple of distance 8.
Given an interval [a, b] , k , and s , your task is to write a program to find the number of prime k -tuples of distance s in the interval [a, b] .
Input
The input file consists of several data sets. The first line of the input file contains the number of data sets which is a positive integer and is not bigger than 20. The following lines describe the data sets.
For each data set, there is only one line containing 4 numbers, a , b , k and s (a, b < 2 * 109, k < 10, s < 40) .
Output
For each test case, write in one line the numbers of prime k -tuples of distance s .
Sample Input
1100 200 4 8
Sample Output
2
思路:区间筛素数;
数据就是很水,没给定【a,b】区间的大小,然后筛法水过。然后统计的时候,维护两个端点就行了。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<math.h> 7 using namespace std; 8 typedef long long LL; 9 bool prime[100005];10 bool prime_max[20*1000000];11 int ans[100005];12 LL ac[1000007];13 int main(void)14 {15 memset(prime,0,sizeof(prime));16 int i,j;17 int cn = 0;18 for(i = 2; i < 1000; i++)19 if(!prime[i])20 for(j = i; (i*j) < 100005; i++)21 prime[i*j] = true;22 for(i = 2; i < 100005; i++)23 {24 if(!prime[i])25 ans[cn++] = i;26 }27 int n;28 scanf("%d",&n);29 LL a,b,k,t;30 while(n--)31 {32 scanf("%lld %lld %lld %lld",&a,&b,&k,&t);33 memset(prime_max,0,sizeof(prime_max));34 LL s ;35 for(i = 0; i < cn; i++)36 {37 for(s = max(2LL,a/ans[i])*ans[i]; s <= b; s += ans[i])38 {39 if(s >= a)40 prime_max[s-a] = true;41 }42 }43 int v = 0;44 for(s = a; s <= b; s++)45 {46 if(!prime_max[s-a])47 ac[v++] = s;48 }49 int l = 0;50 int r = k-1;51 LL ask = 0;52 while(true)53 {54 if(r >= v)55 break;56 if(ac[r] - ac[l] == t)57 {58 ask++;59 }60 l++;61 r++;62 }63 printf("%lld\n",ask);64 }65 return 0;66 }
3998 - Prime k-tuple