Cod sursa(job #2020511)

Utilizator PajarajaPavle Martinovic Pajaraja Data 10 septembrie 2017 15:49:24
Problema Light2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <bits/stdc++.h>
using namespace std;
long long a[22];
long long nzs[2500000];
long long gcd(long long a,long long b)
{
	if(b%a==0) return a;
	return gcd(b%a,a);
}
short brjed(int x)
{
	if(x==0) return 0;
	if(x%2==1) return 1+brjed(x-1);
	return brjed(x/(x & (-x)));
}
int main()
{
	freopen("light2.in","r",stdin);
	freopen("light2.out","w",stdout);
	int k;
	long long n,rez=0;
	scanf("%lld %d",&n,&k);
	for(int i=0;i<k;i++) scanf("%d",&a[i]);
	nzs[0]=1;
	for(int i=1;i<(1<<k);i++)
	{
		int r=i,x=0;
		nzs[i]=1;
		bool m=true;
		for(int j=0;j<k;j++)
		{
			int t=r%2;
			if(m&&t==1)
			{
				x=brjed(i);
				if(nzs[i xor (1<<j)]<=n) nzs[i]=a[j]*nzs[i xor (1<<j)]/gcd(fmin(a[j],nzs[i xor (1<<j)]),fmax(a[j],nzs[i xor (1<<j)]));
				else nzs[i]=nzs[i xor (1<<j)];
				break;
			}
			r/=2;
		}
		int sg=(x%2==0?-1:1);
		if(m) rez+=sg*(1<<(x-1))*(n/nzs[i]);
	}
	printf("%lld",rez);
	fclose(stdout);
}