Cod sursa(job #775537)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 8 august 2012 13:56:03
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<iostream>
#include<fstream>
#include<bitset>
using namespace std;
bitset <1001> d;
int v[100001],a[100001];
void ciur(int n)
{
	int i,j;
	d[0]=1;
	d[1]=1;
	for(i=2;i<=n;i++)
		if(d[i]==0)
			for(j=i+i;j<=n;j=j+i)
				d[j]=1;
}
int cautarebinara(int p, int q, int x)
{
	int mij,st,dr,aux;
	st=p;
	dr=q;
	while(p<q) {
		mij=(p+q)/2;
		if(x>=a[mij])
			p=mij+1;
		else q=mij;
	}
	mij=(p+q)/2;
	if(a[mij]>x)
		mij--;
	aux=mij;
	p=st;
	q=dr;
	while(p<q) {
		mij=(p+q)/2;
		if(x>a[mij])
			p=mij+1;
		else q=mij;
	}
	mij=(p+q)/2;
	if(a[mij]>x)
		mij++;
	return aux-mij+1;
}
int main ()
{
	int n,k,i,nr;
	ifstream f("kprime.in");
	ofstream g("kprime.out");
	f>>n>>k;
	for(i=1;i<=n;i++)
		f>>v[i];
	f.close();
	ciur(1000);
	for(i=1;i<=n;i++) {
		a[i]=a[i-1];
		if(d[v[i]]==0)
			a[i]++;
	}
	nr=0;
	for(i=k;i<=n;i++)
		if(a[i]>=k) 
			nr=nr+cautarebinara(0,i,a[i]-k);
	g<<nr;
	g.close();
	return 0;
}