Cod sursa(job #2102369)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 8 ianuarie 2018 18:44:25
Problema Indep Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <cstdio>
#include <vector>
#include <iostream>
#define BAZA 1000000000
#define MAXN 1001
using namespace std;
typedef int HUGE[150];
bool ciur[MAXN];
vector <int> prime;
int v[500];
HUGE a[MAXN],one={1,1};
inline void inmult(HUGE a,HUGE b)
{
    int t=0;
    a[0]=max(a[0],b[0]);
    for(int i=1;i<=a[0];i++)
    {
        a[i]=a[i]*b[i]+t;
        t=a[i]/BAZA;a[i]%=BAZA;
    }
    while(t)
    {
        a[++a[0]]=t%BAZA;
        t/=BAZA;
    }
}
inline void adun(HUGE a,HUGE b,char semn)
{
    int t=0;
    a[0]=max(a[0],b[0]);
    for(int i=1;i<=a[0];i++)
    {
        a[i]+=(b[i]+t)*semn;
        t=a[i]/BAZA;a[i]%=BAZA;
    }
    if(t)
        a[++a[0]]=t;
    if(!a[a[0]])
        a[0]--;
}
inline void lgput(HUGE a,int n)
{
    HUGE b={1,2};
    while(n)
    {
        if(n&1)
            inmult(a,b);
        inmult(b,b);
        n>>=1;
    }
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("indep.in","r");
    fout=fopen("indep.out","w");
    int n,nr,lim,nrbit,prod,mask,maxim;
    char semn;
    for(int i=2;i*i<MAXN;i++)
        for(int j=i*i;j<MAXN;j+=i)
            ciur[j]=true;
    for(int i=2;i<MAXN;i++)
        if(!ciur[i])
            prime.push_back(i);
    fscanf(fin,"%d",&n);
    for(int i=0;i<n;i++)
    {
        fscanf(fin,"%d",&v[i]);
        maxim=max(maxim,v[i]);
    }
    lim=1<<prime.size();a[1][0]=a[1][1]=1;
    lgput(a[1],n);adun(a[1],one,-1);
    for(int i=1;i<lim;i++)
    {
        prod=mask=1;nr=0;
        for(unsigned int j=0;j<prime.size();j++)
        {
            if(i&mask)
                prod*=prime[j];
            mask<<=1;
        }
        if(prod<=maxim)
        {
            for(int j=0;j<n;j++)
                if(v[j]%prod==0)
                    nr++;
            a[prod][0]=a[prod][1]=1;
            lgput(a[prod],nr);
            adun(a[prod],one,-1);
        }
    }
    for(int i=1;i<lim;i++)
    {
        nrbit=0;prod=mask=1;
        for(unsigned int j=0;j<prime.size();j++)
        {
            if(i&mask)
                nrbit++,prod*=prime[j];
            mask<<=1;
        }
        if(prod<=maxim)
        {
            if(nrbit&1)
                semn=-1;
            else
                semn=1;
            adun(a[1],a[prod],semn);
        }
    }
    fprintf(fout,"%d",a[1][a[1][0]]);
    for(int i=a[1][0]-1;i>0;i--)
        fprintf(fout,"%.9d",a[1][i]);
    fclose(fin);
    fclose(fout);
    return 0;
}