Cod sursa(job #422322)

Utilizator mini.carabetCarasmin Cosbetinov mini.carabet Data 22 martie 2010 15:22:10
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <algorithm>
#define N 1000000009
#define P 400005
using namespace std;
int n,nr,s,d,numere[7];
long long exp2[32],a[P];
void precalcul2()
{
	int i;
	exp2[0]=1;
	for (i=1; i<=30; i++)
		exp2[i]=exp2[i-1]*2;
}
void desc(long long x)
{
	s=0;
	long long salv;
	salv=x;
	while (salv%2==0)
	{
		s++;
		salv/=2;
	}
	d=salv;
}
long long ridic(long long n,long long p,long long nr)
{
	long long rez=1;
	n=n%nr;
	while(p)
	{
		if (p%2)
			rez=(long long)rez*n%nr;
		n=n*n%nr;
		p/=2;
	}
	return rez;
}
void precalcul()
{
	numere[1]=2;
	numere[2]=3;
	//numere[3]=61;
	//numere[4]=7;
	//numere[5]=11;
	//numere[6]=13;
}
char prim(long long x)
{
	if (x==1)
		return 0;
	if (x==2 || x==3)
		return 1;
	if (x%2==0)
		return 0;
	desc(x-1);
	int i,r,ok=0;
	long long t;
	for (i=1; i<=2; i++)
	{
		ok=0;
		if (ridic(numere[i],d,x)==1)
			ok=1;
		else	
			for (r=0; r<=s-1; r++)
			{
				t=exp2[r];
				t*=(long long)d;
				if (ridic(numere[i],t,x)==x-1)
				{
					ok=1;
					break;
				}
			}
		if (ok==0)
			return 0;
	}
	return 1;
}
int main()
{
	freopen("dk.in","r",stdin);
	freopen("dk.out","w",stdout);
	scanf("%d",&n);
	int i,bun=0;
	precalcul();
	precalcul2();
	for (i=1; i<=n; i++)
		scanf("%lld",&a[i]);
	sort(a+1,a+n+1);
	for (i=1; i<=n; i++)
	{
		if (a[i]==a[i-1])
			if (bun)
				nr++;
			else
				;
		else
			if (prim(a[i]))
			{
				nr++;
				bun=1;
			}
			else
				bun=0;
	}
	printf("%d\n",nr);
	return 0;
}