Cod sursa(job #547753)

Utilizator ProtomanAndrei Purice Protoman Data 6 martie 2011 17:55:54
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define ll long long
#define pb push_back

using namespace std;

ll n, m, sol, st, el;
ll d[32];

inline ll gcd(ll a, ll b)
{
    if (!b)
        return a;
    return gcd(b, a % b);
}

inline void back(int level, ll cmmmc)
{
	if (level == n)
	{
		sol += st * (m / cmmmc) * (1 << (el - 1));

		return;
	}

	back(level + 1, cmmmc);
	
	if (st == 1)
		st = -1;
	else st = 1;
	el++;
	back(level + 1, cmmmc / gcd(cmmmc, d[level]) * d[level]);
	el--;
	if (st == 1)
		st = -1;
	else st = 1;
}

int main()
{
	freopen("light2.in", "r", stdin);
	freopen("light2.out", "w", stdout);

    scanf("%lld", &m);

    scanf("%lld", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &d[i]);

	back(0, (ll) 1);

    printf("%lld\n", sol);

	fclose(stdin);
	fclose(stdout);
    return 0;
}