Cod sursa(job #350565)

Utilizator Addy.Adrian Draghici Addy. Data 24 septembrie 2009 19:51:19
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#define DIM 5000002

int V[2][DIM];
int r,d,sol,i,k;

int min(int a, int b) {
	return a<b?a:b;
}

int main() {
	
	FILE *f = fopen("pascal.in","r");
	FILE *g = fopen("pascal.out","w");
	
	fscanf(f,"%d%d",&r,&d);
	
	if (d==2 || d==3 || d==5) {
		for (i=1; i<=r; i++) {
			k = i;
			while (k%d==0) {
				V[0][i]++;
				k /= d;
			}
			V[0][i] += V[0][i-1];
		}
		for (k=1; k<=(r+1)/2-1; k++)
			if (V[0][r]-V[0][k]-V[0][r-k]>0)
				sol += 2;
		if (r%2==0) {
			k = r/2;
			if (V[0][r]-V[0][k]-V[0][r-k]>0)
				sol++;
		}
	}
	else
		if (d==4) {
			d = 2;
			for (i=1; i<=r; i++) {
				k = i;
				while (k%d==0) {
					V[0][i]++;
					k /= d;
				}
				V[0][i] += V[0][i-1];
			}
			for (k=1; k<=(r+1)/2-1; k++)
				if (V[0][r]-V[0][k]-V[0][r-k]>1)
					sol += 2;
			if (r%2==0) {
				k = r/2;
				if (V[0][r]-V[0][k]-V[0][r-k]>1)
					sol++;
			}
		}
		else
			if (d==6) {
				d = 2;
				for (i=1; i<=r; i++) {
					k = i;
					while (k%d==0) {
						V[0][i]++;
						k /= d;
					}
					V[0][i] += V[0][i-1];
				}
				d = 3;
				for (i=1; i<=r; i++) {
					k = i;
					while (k%d==0) {
						V[1][i]++;
						k /= d;
					}
					V[1][i] += V[1][i-1];
				}
				for (k=1; k<=(r+1)/2-1; k++)
					if (min(V[0][k],V[1][k])>0)
						sol += 2;
				if (r%2==0) {
					k = r/2;
					if (min(V[0][k],V[1][k])>0)
						sol += 1;
				}
			}
	
	fprintf(g,"%d",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}