Cod sursa(job #1758580)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 17 septembrie 2016 15:05:17
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
#include <algorithm>

using namespace std;

constexpr int kMaxK = 22;

int value[kMaxK];

long long n;
int k;

long long answer = 0LL;

long long gcd(const long long a, const long long b) {
	if (b == 0) {
		return a;
	}
	return gcd(b, a - a / b * b);
}

void compute_pinex(int ptr, int sign, int cardinal, long long lcm) {
	for (int i = ptr + 1; i < k; i += 1) {
		const long long next_lcm = lcm * value[i] / gcd(lcm, value[i]);
		if (next_lcm < n) {
			answer += sign * ((n / next_lcm) << cardinal);
			compute_pinex(i, -sign, cardinal + 1, next_lcm);
		}
	}
}

int main() {
	ifstream cin("light2.in");
	ofstream cout("light2.out");
	cin.tie(0);
	ios_base::sync_with_stdio(false);

	cin >> n >> k;
	for (int i = 0; i < k; i += 1) {
		cin >> value[i];
	}
	sort(value, value + k);
	reverse(value, value + k);

	compute_pinex(-1, 1, 0, 1);

	cout << answer << '\n';

	return 0;
}