Cod sursa(job #2209001)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 1 iunie 2018 14:43:26
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("pascal.in");
ofstream fo("pascal.out");

const int N = 5000005;

int leg[3][N], d[3];

int ant, n, dv, t;


int main() {
	fi >> n >> dv;

	if (dv % 2 == 0)
	for (int i = 1; i < N; ++i) {
		t = i;
		while (t % 2 == 0) {
			leg[0][i]+= 1;
			t/= 2; } }

	if (dv % 3 == 0)
	for (int i = 1; i < N; ++i) {
		t = i;
		while (t % 3 == 0) {
			leg[0][i]+= 1;
			t/= 3; } }

	if (dv % 5 == 0)
	for (int i = 1; i < N; ++i) {
		t = i;
		while (t % 5 == 0) {
			leg[0][i]+= 1;
			t/= 5; } }


	for (int i = 0; i < 3; ++i)
	for (int j = 1; j < N; ++j)
		leg[i][j]+= leg[i][j - 1];

	if (dv % 2 == 0) 
		d[0]+= 1;
	if (dv % 3 == 0)
		d[1]+= 1;
	if (dv % 4 == 0)
		d[0]+= 1;
	if (dv % 5 == 0)
		d[2]+= 1;

	for (int st = 0, dr = n; st < dr; ++st, --dr) {
		bool flag = true;
		for (int p = 0; p < 3 && flag; ++p)
			flag&= d[p] <= (leg[p][n] - leg[p][st] - leg[p][n - st]);
		ant+= 2 * int(flag); }

	if (n % 2 == 0) {
		bool flag = true;
		for (int p = 0; p < 3 && flag; ++p)
			flag&= d[p] <= (leg[p][n] - leg[p][n / 2] - leg[p][n / 2]);
		ant+= int(flag); }

	fo << ant << endl;

	return 0; }