Cod sursa(job #387121)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 26 ianuarie 2010 20:54:58
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<fstream>
#include<algorithm>

using namespace std;
ofstream fout("suman.out");
long long v[25],n,kk,x[25];
long long r=0;

long long cats(long long div)//calculeaza suma multiplilor de div a elementelor din intervalul [1,n]
{
    long long rez=div*(((n/div)*(n/div+1))/2);
    return rez;
}

void afis(long long j)
{
    long long q=1;
    long long semn=-1;
    if(j%2==1)
        semn=1;
    long long z=v[x[1]];
    if(j>1)
        for(long long i=2;i<=j;i++)
        {
            long long aa=z,a=z,b=v[x[i]],bb=v[x[i]];
            while(a!=b)
                    if(a<b)
                        b=b-a;
                    else
                        a=a-b;
            z=aa*bb/a;
        }
    q=z;
    r+=semn*cats(q);
}

void back(long long k,long long j)
{
    long long i;
    for(i=x[k-1]+1;i<=kk;i++)
    {
        x[k]=i;
        if(k==j)
        {
            afis(j);
        }
        else
            back(k+1,j);
    }
}

void scoatemultipli()
{
    int i,j,l;
    for(i=1;i<kk;i++)
    {
        for(j=i+1;j<=kk;j++)
            if(v[j]%v[i]==0)
            {
                for(l=j;l<kk;l++)
                    v[l]=v[l+1];
                kk--;
            }
    }
}

void afis()
{
    int i;
    fout<<n<<" "<<kk<<endl;
    for(i=1;i<=kk;i++)
        fout<<v[i]<<" ";
    fout<<endl;
    fout.flush();
}

int main()
{
    ifstream fin("suman.in");
    fin>>n>>kk;
    long long i;
    for(i=1;i<=kk;i++)
        fin>>v[i];
    sort(v+1,v+kk+1);
    for(i=1;i<=kk;i++)
       scoatemultipli();
    for(i=1;i<=kk;i++)
    {
        back(1,i);
    }
    fout<<r;
    return 0;
}