Cod sursa(job #2573216)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 5 martie 2020 16:30:47
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#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;
}