Cod sursa(job #1032407)

Utilizator harababurelPuscas Sergiu harababurel Data 15 noiembrie 2013 19:24:32
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda FMI No Stress 4 Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define nmax (1000000000000000000LL)
#define ll long long
using namespace std;

string s;
ll val, n, sol;
int lo, mid, hi;

vector <ll> pdoi, ptri, pcinci, psepte, punspe;

ll parse(string s) {
	ll x = 0;
	for(int i=0; i<s.size(); i++) x = x * 10LL + 1LL*int(s[i]) - 48LL;
	return x;
}

int main() {
	ifstream f("dtcsu.in");
	ofstream g("dtcsu.out");

	for(int i=1; i<=276997; i++) getline(f, s);

	for(ll i = 1LL; i<=nmax; i *= 2LL) pdoi.push_back(i);
	for(ll i = 1LL; i<=nmax; i *= 3LL) ptri.push_back(i);
	for(ll i = 1LL; i<=nmax; i *= 5LL) pcinci.push_back(i);
	for(ll i = 1LL; i<=nmax; i *= 7LL) psepte.push_back(i);
	for(ll i = 1LL; i<=nmax; i *= 11LL) punspe.push_back(i);

	getline(f, s);
	n = parse(s);

	for(int i=1; i<=n; i++) {
		getline(f, s);
		val = parse(s);

		//cout<<"val = "<<val<<".\n";

		lo = -1; hi = pdoi.size();
		while(hi - lo > 1) {
			mid = (lo + hi) >> 1;
			if(val % pdoi[mid] == 0LL) lo = mid; else hi = mid;}
		val /= pdoi[lo];
	
		lo = -1; hi = ptri.size();
		while(hi - lo > 1) {
			mid = (lo + hi) >> 1;
			if(val % ptri[mid] == 0LL) lo = mid; else hi = mid;}
		val /= ptri[lo];

		lo = -1; hi = pcinci.size();
		while(hi - lo > 1) {
			mid = (lo + hi) >> 1;
			if(val % pcinci[mid] == 0LL) lo = mid; else hi = mid;}
		val /= pcinci[lo];

		lo = -1; hi = psepte.size();
		while(hi - lo > 1) {
			mid = (lo + hi) >> 1;
			if(val % psepte[mid] == 0LL) lo = mid; else hi = mid;}
		val /= psepte[lo];

		lo = -1; hi = punspe.size();
		while(hi - lo > 1) {
			mid = (lo + hi) >> 1;
			if(val % punspe[mid] == 0LL) lo = mid; else hi = mid;}
		val /= punspe[lo];


		if(val == 1LL) sol++;
	}

	g<<sol<<"\n";

	return 0;
}