思路:用深搜来使k个整数相加再判断该数是否为素数即可。
代码如下:
#include<stdio.h>
int a[200000000],book[200000000],q,w,sum,l;
int ss(int y)
{
for(int z=2;z<y;z++){
if(y%z==0)
return 0;
}
return 1;
}
void dfs(int we,int wr)
{
if(wr>=w)
{
if(ss(sum))
l++;
return ;
}
if(we>q) return ;
for(int i=we+1;i<=q;i++){
if(book[i]==0){
sum+=a[i];
book[i]=1;
dfs(i,wr+1);
book[i]=0;
sum-=a[i];
}
}
}
int main()
{
scanf("%d%d",&q,&w);
for(int i=1;i<=q;i++){
scanf("%d",&a[i]);
}
for(int k=1;k<=q;k++){
sum=0;
sum+=a[k];
book[k]=1;
dfs(k,1);
book[k]=0;
sum-=a[k];
}
printf("%d",l);
return 0;
}
思路:先排序(用快排),再用两个右端点r1 , r2,每次r1右移到a[r1] - a[l] <= c
的最后位置的下一位,r2右移到满足a[r2] - a[l] < c
最后一位。
也就是是说, 此时如果a[r2]-a[l]==c&&a[r1-1]-a[l]==c,
中间的那一段一定都是满足条件的,我们让sum+=r1-r2
即可。
代码如下:
#include<stdio.h>
int a[200003];
void quicksort(int l,int r)
{
int i,j;
if(l>r)
return;
i=l;
j=r;
while(i!=j)
{
while(a[j]>=a[l]&&i<j)
j--;
while(a[i]<=a[l]&&i<j)
i++;
if(i<j)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int t=a[l];
a[l]=a[i];
a[i]=t;
quicksort(l,i-1);
quicksort(i+1,r);
return;
}
int main()
{
int n,c;
long long sum=0;
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
int l,r1=2,r2=2;
for(l = 1 ; l <= n ; l ++) {
while(r1 <= n && a[r1] - a[l] <= c) r1 ++;
while(r2 <= n && a[r2] - a[l] < c ) r2 ++;
if(a[r2] - a[l] == c && a[r1 - 1] - a[l] == c && r1 - 1 >= 1)
{
sum += r1 - r2;
}
}
printf("%lld\n",sum);
return 0;
}