Cod sursa(job #3293182)

Utilizator nistor_dora_valentinaNistor Dora Valentina nistor_dora_valentina Data 10 aprilie 2025 16:52:18
Problema Indep Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <fstream>
#include <vector>

#define int long long
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int n, i, a[505], dp[1005], sum[505][1005], j, mobius[1005], ans, maxim;
int cmmdc(int a, int b)
{
    int rest=0;
    while(b)
    {
        rest=a%b;
        a=b;
        b=rest;
    }
    return a;
}
signed main()
{
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>a[i];
        for(j=1; j<=1000; j++)
            if(a[i]%j==0)
                sum[i][j]=sum[i-1][j]+1;
            else
                sum[i][j]=sum[i-1][j];
    }
    for(i=1; i<=n; i++)
        for(j=i+1; j<=n; j++)
        {
            int c=cmmdc(a[i], a[j]);
            if(c!=1)
            {
                for(int k=1; k*k<=c; k++)
                    if(c%k==0)
                    {
                        if(k!=1)
                        {
                            int nr=sum[j-1][k]-sum[i][k];
                            // fout<<k<<" "<<nr<<" "<<i<<" "<<j<<'\n';
                            dp[k]+=(1<<nr);
                        }
                        if(c/k!=1)
                        {
                            int nr=sum[j-1][c/k]-sum[i][c/k];
                            //  fout<<c/k<<" "<<nr<<" "<<i<<" "<<j<<'\n';
                            dp[c/k]+=(1<<nr);
                        }
                    }
            }

        }
    ans=n;
    for(i=2; i<=1000; i++)
    {
        if(dp[i])
        {
            int d=2, c=i;
            vector <int> prim;
            while(c>1)
            {
                if(c%d==0)
                {
                    prim.push_back(d);
                    while(c%d==0)
                        c/=d;
                }
                d++;
                if(d*d>c)
                    d=c;
            }
            int nr=prim.size();
            for(int mask=1; mask<(1<<nr); mask++)
            {
                int nr2=0, p=1;
                for(int j=0; j<nr; j++)
                    if(mask&(1<<j))
                    {
                        p*=prim[j];
                        nr2++;
                    }
                //fout<<p<<" "<<nr2<<'\n';
                if(nr2%2==0 && nr2!=0)
                    ans-=dp[p];
                else
                    ans+=dp[p];
            }
        }

    }
    fout<<(1<<n)-ans-1;
    return 0;
}