Cod sursa(job #1043752)

Utilizator raulstoinStoin Raul raulstoin Data 28 noiembrie 2013 22:04:51
Problema Dtcsu Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<cstdio>
#include<bitset>

#define NMAX 276997
#define LL long long
#define LMAX 5500000

using namespace std;

FILE *fin,*fout;

int v[]={3,5,7,11},q,sol,L;
LL n,nr;
bitset<LMAX> use;

const int SZ=10000;
char input[SZ+1],*in;

union TIP
{
	LL n;
	char x[8];
}Var;

LL conv()
{
	LL nr=0;
	for(;!(*in>='0' && *in<='9') && *in;in++);
	 
	if(in==input+SZ)
	{
		fread(input,1,SZ,fin);
		in=input;
	}
  
	for(;*in>='0' && *in<='9';in++)
	{
		nr=nr*10+(*in-'0');
		if(in+1==input+SZ)
		{
			fread(input,1,SZ,fin);
			in=input-1;
		}
	}
	return nr;
}

int MurmurHash2 ( const char * key, int len, unsigned int seed )
{
	const unsigned int m = 0x5bd1e995;
	const int r = 24;
	unsigned int h = seed ^ len;
	const unsigned char * data = (const unsigned char *)key;
	for(unsigned int k;len >= 4;data += 4,len -= 4)
	{
		k = *(unsigned int *)data;
		k *= m; 
		k ^= k >> r; 
		k *= m;
		h *= m;
		h ^= k;
	}
	switch(len)
	{
	case 3: h ^= data[2] << 16;
	case 2: h ^= data[1] << 8;
	case 1: h ^= data[0];
			h *= m;
	};
	h ^= h >> 13;
	h *= m;
	h ^= h >> 15;
	return h%LMAX;
}

int FNV(char *x)
{
	unsigned LL hash = 14695981039346656037ULL;
	for(int i=0;i<L;i++)
	{
		hash = (hash%LMAX) * 1099511628211LL;
		hash = hash^x[i];
	}
	return hash%LMAX;
}

int main()
{
	fin=fopen("dtcsu.in","r");
	fout=fopen("dtcsu.out","w");
	fread(input,1,SZ,fin);
	in=input;
	for(int i=0;i<NMAX;i++)
	{
		Var.n=conv();
		use[MurmurHash2(Var.x,8,454645)]=1;
		use[FNV(Var.x)]=1;
	}
	
	q=conv();
	for(;q;q--)
	{
		Var.n=conv();
		if(!use[MurmurHash2(Var.x,8,454645)] || !use[FNV(Var.x)])
			continue;
		for(int i=0;i<4;i++)
			for(;Var.n%v[i]==0;Var.n/=v[i]);
		sol+=((Var.n&(Var.n-1))==0);
	}
	fprintf(fout,"%d",sol);
	return 0;
}