Cod sursa(job #2102467)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 8 ianuarie 2018 20:54:48
Problema Indep Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <iostream>
#define BAZA 1000000000
#define MAXN 1001
using namespace std;
typedef int HUGE[150];
int v[500];
HUGE two[500],one={1,1},rez;
inline void adun(HUGE a,HUGE b)
{
    int t=0;
    a[0]=max(a[0],b[0]);
    for(int i=1;i<=a[0];i++)
    {
        a[i]+=b[i]+t;
        t=a[i]/BAZA;a[i]%=BAZA;
    }
    if(t)
        a[++a[0]]=t;
}
inline void scad(HUGE a,HUGE b)
{
    int t=0;
    for(int i=1;i<=a[0];i++)
    {
        a[i]-=b[i]+t;
        t=a[i]/BAZA;a[i]=(a[i]+BAZA)%BAZA;
    }
    if(!a[a[0]])
        a[0]--;
}
inline void atrib(HUGE a,HUGE b)
{
    int nr=b[0];
    for(int i=0;i<=nr;i++)
        a[i]=b[i];
}
inline bool desc(int x,int &nr)
{
    int d=2;
    while(d*d<=x)
    {
        if(x%d==0)
        {
            x/=d;nr++;
            if(x%d==0)
                return false;
        }
        d++;
    }
    if(x>1)
        nr++;
    return true;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("indep.in","r");
    fout=fopen("indep.out","w");
    int n,maxim=0,nr,co;
    char semn;
    fscanf(fin,"%d",&n);
    for(int i=0;i<n;i++)
    {
        fscanf(fin,"%d",&v[i]);
        maxim=max(maxim,v[i]);
    }
    two[0][0]=1;two[0][1]=2;
    for(int i=1;i<n;i++)
    {
        atrib(two[i],two[i-1]);
        adun(two[i],two[i-1]);
    }
    for(int i=0;i<n;i++)
        scad(two[i],one);
    atrib(rez,two[n-1]);
    for(int i=2;i<=maxim;i++)
    {
        co=nr=0;
        if(desc(i,nr))
        {
            for(int j=0;j<n;j++)
                if(v[j]%i==0)
                    co++;
            if(co)
            {
                if(nr&1)
                    scad(rez,two[co-1]);
                else
                    adun(rez,two[co-1]);
            }
        }
    }
    fprintf(fout,"%d",rez[rez[0]]);
    for(int i=rez[0]-1;i>0;i--)
        fprintf(fout,"%d",rez[i]);
    fclose(fin);
    fclose(fout);
    return 0;
}