Cod sursa(job #71743)

Utilizator zobicaMarin Marin zobica Data 11 iulie 2007 15:24:48
Problema Pascal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>

using namespace std;

long r, d, s[50000001], s1[50000002], pu[23] ;

void citire() {
	ifstream fin("pascal.in");
	fin >> r >> d;
	fin.close();
}


long putere(long x, int d) {
	long nr = 0;
	while (!(x % d)) {
		nr ++;
		x /= d;
	}
	return nr;
}

void fac_sir (long s[], int d) {
	for (int i = 2; i <= r; i ++) 		
		s[i] = putere(i, d);	
}


long divizor (long x, long x3, long d) {
	switch (d) {
		case 2 :
		case 3 :
		case 5 :			
			return (x > 0);
			break;
		case 6 :			
			return (x > 0 && x3 > 0);
			break;										   
		case 4 : 
			return (x > 1);
			break;						
	}
	return 0;
}

long numar() {
	long nr = 0, nrd1 = 0, nrd2, nd31 = 0, nd32;
	for (long i = 1; i < (( r + 1) >> 1); i++) {
		nrd2 = nrd1 + s[r - i + 1] - s[i];				
		nd32 = nd31 + s1[r - i + 1] - s1[i];				
		nrd1 = nrd2;
		nd31 = nd32;
		nr += divizor(nrd1, nd31, d);		 
	}
	nr <<= 1;
	long mij = (r >> 1);
	if ( (r & 1) == 0 ) {
		nrd1 += s[r - mij + 1] - s[mij];				
		nd31 += s1[r - mij + 1] - s1[mij];				
		nr += divizor(nrd1,nd31, d);		 
	}
	return nr;
}

int main() {
	citire();
	if (d != 6 && d != 4)
		fac_sir(s, d);
	else 
		if (d == 4 )
			fac_sir(s, 2);
		else {
			fac_sir(s, 2);
			fac_sir(s1, 3);
		}

		ofstream fout("pascal.out");
		fout << numar();
		fout.close();

		return 0;
}