Cod sursa(job #701137)

Utilizator ms-ninjacristescu liviu ms-ninja Data 1 martie 2012 13:51:21
Problema Divk Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <bitset>
using namespace std;

#define dim 10000
int q[2000];
bitset <dim> v;
int divk[100], a[100], b[100], c[100];

int main()
{
	ifstream fin("divk.in");
	ofstream fout("divk.out");
	int n, m,k, i, j, contor, f;
	fin>>n >>m >>k;
	
	
	q[0]=2;
	f=1;
	
	for(i=2;i<dim;++i)
	{
		++i;
		if(v[i]==0)
		{
			q[f]=i;
			++f;
			for(j=i;j<=dim/i;++j)
			{
				v[i*j]=1;
				++j;
			}
		}
	}
	
	contor=0;
	for(i=0;i<=f&&k!=1;++i)
	{
		if(k%q[i]==0)
		{
			divk[contor]=q[i];
			
			while(k%q[i]==0)
			{
				k/=q[i];
				++a[contor];
			}
			++contor;
		}
	}
	--contor;
	
	
	int raspunsuri=0,nr;
	for(i=1;i<=n;++i)
	{
		fin>>nr;
		
		int contor1=0;
		
		for(j=0;j<=f&&nr!=1;++j)
		{
			if(nr%q[j]==0)
			{
				b[contor1]=q[j];
				while(nr%q[j]==0)
				{
					nr/=q[j];
					++c[contor1];
				}
				++contor1;
			}
		}
		--contor1;
		
		int val=1;
		for(int x=0;x<=contor;++x)
		{
			int aux=divk[x];
			int ok=1,z;
			
			for(z=0;z<=contor1;++z)
				if(aux==b[z])
				{
					ok=0;
					break;
				}
				
			if(ok==0)
			{
				if(m*c[z]<a[x])
					val=0;
			}
			else
			{
				val=0;
				break;
			}
		}
		
		if(val==1)
			++raspunsuri;
		
		for(j=0;j<=contor1;++j)
			b[j]=c[j]=0;
		
		
	}
	
	
	fout<<raspunsuri;
	
	return 0;
}