Pagini recente » Cod sursa (job #2373016) | Cod sursa (job #1147500) | Cod sursa (job #1391804) | selectie_emag_mediu_2016_runda2 | Cod sursa (job #2573216)
#include <bits/stdc++.h>
#define LGMAX 1048600
using namespace std;
ifstream fin("suman.in");
ofstream fout("suman.out");
int v[LGMAX];
struct tip
{
long long int nr;
};
long long int dp[LGMAX];
int n,k;
int i,j;
int mask;
long long int rez;
long long int cmmdc(long long int a,long long int b)
{
long long int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
fin>>n>>k;
for(i=1; i<=k; i++)
fin>>v[i];
long long int sum=0;
//for(i=1;i<=k;i++)
// sum+= v[i] * ( (n/v[i]* (n/v[i]+1) )/2 );
for(i=1; i<(1<<k) ; i++)
{
int cate=0;
rez=0;
for(j=0; j<k; j++)
if( (1<<j) & i)
break;
int mask=(i ^ (1<<j));
if(!mask)
{
dp[i]=v[j+1];
rez=v[j+1];
}
else
{
///calculez rez ul
if(dp[mask]==-1)
{dp[i]=-1;rez=-1;}
else
{
rez= dp[mask]* v[j+1]/ cmmdc(dp[mask],v[j+1]);
if(rez>n)
{
dp[i]=-1;
rez=-1;
}
else
{
dp[i]=rez;
}
}
}
if(dp[i]!=-1)
{
for(j=0; j<k; j++)
if( (1<<j) & i)
cate++;
rez=dp[i];
//fout<<rez<<" "<<rez * ((( n/rez) *(n/rez+1))/2)<<" ";
if(cate%2==1)
sum+= rez * ((( n/rez) *(n/rez+1))/2);
else
sum-= rez * ((( n/rez) *(n/rez+1))/2);
}
}
fout<<sum;
return 0;
}