Cod sursa(job #541598)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 25 februarie 2011 12:25:29
Problema Light2 Scor 100
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 1 Marime 0.95 kb
#include <stdio.h>

int n;
int v[25], c[25][25], d[25];
long long k, sol;

long long cmmdc (long long a, long long b)
{
	long long r;
	
	while (b)
	{
		r = a % b;
		a = b;
		b = r;
	}
	
	return a;
}

void back (int i, int nr, long long prod)
{
	if (prod > k)
		return;
	
	if (i == n + 1)
	{
		if (nr & 1)
			sol = sol - k / prod * d[nr];
		else
			sol = sol + k / prod * d[nr];
		return;
	}
	
	back (i + 1, nr, prod);
	back (i + 1, nr + 1, prod * v[i] / cmmdc (prod, v[i]));
}

int main ()
{
	freopen ("light2.in", "r", stdin);
	freopen ("light2.out", "w", stdout);
	
	scanf ("%lld %d", &k, &n);
	
	int i, j;
	
	for (i = 1; i <= n; i ++)
		scanf ("%d", &v[i]);
		
	c[0][0] = 1;
	for (i = 1; i <= n; i ++)
	{
		c[i][0] = 1;
		for (j = 1; j <= i; j ++)
			c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
	}
	
	for (i = 0; i <= n; i ++)
	{
		j = 0;
		if (i & 1)
			j = 1;
		for (; j <= i; j += 2)
			d[i] += c[i][j];
	}
	
	back (1, 0, 1);
	
	printf ("%lld\n", k - sol);
	
	return 0;
}