Cod sursa(job #1563516)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 6 ianuarie 2016 05:45:46
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <iostream>
using namespace std;

constexpr int sz = 5000010;
int nr_2[sz], nr_3[sz], nr_5[sz];

void init_all(){
	for(int p = 2; p < sz; p *= 2){
		for(int i = p; i < sz; i += p){
			++nr_2[i]; } }
	for(int p = 3; p < sz; p *= 3){
		for(int i = p; i < sz; i += p){
			++nr_3[i]; } }
	for(int p = 5; p < sz; p *= 5){
		for(int i = p; i < sz; i += p){
			++nr_5[i]; } }
	for(int i = 1; i < sz; ++i){
		nr_2[i] += nr_2[i-1];
		nr_3[i] += nr_3[i-1];
		nr_5[i] += nr_5[i-1]; } }

bool e_div(const int r, const int c, const int d){
	if(d == 2){
		int n = nr_2[r];
		n -= nr_2[r-c];
		n -= nr_2[c];
		return n > 0; }
	if(d == 3){
		int n = nr_3[r];
		n -= nr_3[r-c];
		n -= nr_3[c];
		return n > 0; }
	else if(d == 4){
		int n = nr_2[r];
		n -= nr_2[r-c];
		n -= nr_2[c];
		return n > 1; }
	if(d == 5){
		int n = nr_5[r];
		n -= nr_5[r-c];
		n -= nr_5[c];
		return n > 0; }
	else if(d == 6){
		int n2 = nr_2[r];
		n2 -= nr_2[r-c];
		n2 -= nr_2[c];

		int n3 = nr_3[r];
		n3 -= nr_3[r-c];
		n3 -= nr_3[c];
		return n2 > 0 && n3 > 0; }
	return 0xbeafface; }

int main(){
	init_all();
	ifstream f("pascal.in");
	ofstream g("pascal.out");
	int r, d;
	f >> r >> d;

	int rez = 0;
	int i = 0, j = r;
	for( ; i < j; ++i, --j){
		rez += 2*e_div(r, i, d); }
	if(i == j){
		rez += e_div(r, i, d); }

	g << rez;
	return 0; }