Cod sursa(job #2648431)

Utilizator adiaioanaAdia R. adiaioana Data 10 septembrie 2020 19:28:31
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#define LL long long
using namespace std;
ifstream cin("indep.in");
ofstream cout("indep.out");

bool prime[510][510];
LL loc[200], ans[200];
inline void scad(LL A[], LL B[]);
inline void inm(LL A[], int B);
inline void print(LL A[]);

int cmmdc(int a, int b)
{
    int r=a%b;
    while(r)
    {
        a=b; b=r; r=a%b;
    }
    return b;
}

int main()
{
    int N, v[501];
    cin>>N;
    for(int i=1; i<=N; ++i)
        cin>>v[i];
    for(int i=1; i<N; ++i)
        for(int j=i+1; j<=N; ++j)
            prime[i][j]=(cmmdc(v[i],v[j])==1);

    ans[0]=ans[1]=1;
    for(int i=1; i<=N; ++i)
        inm(ans,2);

    LL unu[2];
    unu[0]=unu[1]=1;
    scad(ans,unu);

    for(int i=1; i<=N; ++i)
    {
        loc[0]=loc[1]=1;
        for(int j=i+1; j<=N; ++j)
            if(!prime[i][j])
                inm(loc,2);
        scad(ans,loc);
    }

    print(ans);
    return 0;
}

inline void print(LL A[])
{
    for(int i=A[0]; i; --i)
        cout<<A[i];
    cout<<'\n';
}

inline void inm(LL A[], int B)
{
    LL T=0;
    for(int i=1; i<=A[0]; ++i)
    {
        A[i]=A[i]*B+T;
        T=A[i]/10;
        A[i]=A[i]%10;
    }
    while(T)
    {
        A[++A[0]]=T%10;
        T=T/10;
    }
}

inline void scad(LL A[], LL B[])
{
    LL T=0;
    for(int i=1; i<=A[0]; ++i)
    {
        if(i<=B[0])
            A[i]=(A[i]-T-B[i]);
        else A[i]=A[i]-T;
        if(A[i]<0)
            A[i]=A[i]+10, T=1;
        else T=0;
    }

    while(!A[A[0]] && A[0]>1)
        A[0]--;
}