Pagini recente » Cod sursa (job #1491188) | Cod sursa (job #459249) | Cod sursa (job #2564498) | Cod sursa (job #140284) | Cod sursa (job #2181488)
#include <cstdio>
#include <algorithm>
using namespace std;
long long v[30],sol,n;
int p[30],k;
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 pas,int i,long long x){
if (x>n)
return;
// updatez sol ul
//if (x==2)
//printf ("%d ",x);
if (pas!=1){
if (pas%2==0) // sunt de fapt in cazul pas%2==1
sol=sol+(1<<(pas-2))*(n/x);
else sol=sol-(1<<(pas-2))*(n/x);
}
if (pas==k+1)
return;
for (int j=i+1;j<=k;j++){
back (pas+1,j,(x*v[j])/cmmdc(x,v[j]));
}
}
int main()
{
FILE *fin=fopen ("light2.in","r");
FILE *fout=fopen ("light2.out","w");
int i,poz,lc;
fscanf (fin,"%lld%d",&n,&k);
for (i=1;i<=k;i++)
fscanf (fin,"%lld",&v[i]);
sort (v+1,v+k+1);
poz=0;
lc=1;
for (i=1;i<=k;i++){
if (v[i]!=v[i+1]){
if (lc%2==1)
v[++poz]=v[i];
lc=1;
}
else lc++;
}
k=poz;
// facem un fel de pinex
back (1,0,1); // back recursiv
fprintf (fout,"%lld",sol);
return 0;
}