Cod sursa(job #547128)

Utilizator maritimCristian Lambru maritim Data 5 martie 2011 21:46:11
Problema Light2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<stdio.h>
using namespace std;

typedef struct
{
	long long val;
	int nr;
	long long inm;
} valori;

long long n;
short int k;
unsigned long long nr;
long int nri = 0;
long int nrj = 0;
long long A[23];
valori B[100000];
long int bacc = 0;

void citire(void)
{
	long long a;
	FILE *f = fopen("light2.in","r");
	
	fscanf(f,"%lld",&n);
	fscanf(f,"%d",&k);
	for(int i=1;i<=k;i++)
	{
		fscanf(f,"%lld",&B[i].val);
		B[i].nr = 1;
		B[i].inm = 1;
	}
	bacc = k;
	
	fclose(f);
}

int inc(int i,int j)
{
	long int l;
	for(l=1;l<=bacc && B[l].val != i*j;l++);
	return l;
}

void calc(void)
{
	FILE *f = fopen("light2.out","w");
	
	nr = 0;
	for(int i=1;i<=bacc;i++)
		if(!(B[i].nr%2))
			nr -= B[i].inm*(n/B[i].val);
		else
			nr += B[i].inm*(n/B[i].val);	
	fprintf(f,"%lld",nr);
	
	fclose(f);
}

void parcurgere3(void)
{
	for(int i=1;i<=k;i++)
		for(int j=1;j<=k;j++)
			if(i!=j && !(B[i].val%B[j].val))
				B[i].nr ++;
}

void parcurgere1(void)
{
	for(int i=1;i<=nri;i++)
		for(int j=nri+1;j<=nrj;j++)
			if(!(B[j].val%B[i].val))
				B[j].nr ++;
}

int parcurgere2(void)
{
	int gata = 0;
	for(int i=1;i<=nrj;i++)
		for(int j=nri+1;j<=nrj;j++)
			if(B[i].val*B[j].val<=n && B[i].val%B[j].val && B[j].val%B[i].val)
			{
			  if(inc(B[i].val,B[j].val)>bacc)
			  {
				B[++bacc].val = B[i].val*B[j].val;
				if(B[i].inm == 1)
				  B[bacc].inm = 2;
				else
				  B[bacc].inm = B[i].inm*B[i].inm;
				gata ++;
			  }
			}
	return gata;
}

void prel(void)
{
	long int l = 0;
	long int i = 0;
	long int j = 0;
	long int nr1;
	int gata = 1;
	parcurgere3();
	while(gata)
	{
	nrj = bacc;
	parcurgere1();
	gata = parcurgere2();
	nri = nrj;
	}
}

int main()
{
	citire();
	prel();
	calc();
//	for(int i=1;i<=bacc;i++)
//		printf("%7lld ",B[i].val);
//	printf("\n");
//	for(int i=1;i<=bacc;i++)
//		printf("%7d ",B[i].nr);
//	printf("\n");
//	for(int i=1;i<=bacc;i++)
//		printf("%7d ",B[i].inm);
	return 0;
}