Cod sursa(job #2426709)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 29 mai 2019 09:45:15
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#include <bits/stdc++.h>
#include <cmath>

using namespace std;

ifstream f("pairs.in");
ofstream g("pairs.out");
bool gs[1000001];
int   fr[1000001],v[100005],n,i,j,vmax,catipasi=0,prime[100001],cateprime,ci,diviz[30];
long long sol;
bool ciur[2000001];

int main()
{
    f>>n;

    for(i=1; i<=n; i++)
    {
        f>>v[i];
        if(v[i]>vmax) vmax=v[i];
        gs[v[i]]=1;

    }
    for(i=2; i<=vmax; i++)
    {
        for(j=1; j<=vmax/i; j++)
        {
            if(gs[i*j]==1)
            {
                fr[i]++;
            }
        }

    }

    ciur[2]=0;
    cateprime=1;
    prime[1]=2;


    for(j=2; j<=vmax/2; j++)
    {
        ciur[2*j]=1;

    }
    for(int d=3; d<=vmax; d+=2)
    {
        if(ciur[d]==0)
        {

            prime[++cateprime]=d;
            for(j=3; j<=vmax/d; j+=2)
            {
                ciur[d*j]=1;
            }
        }
    }

    int catidiv;
    for( i=1; i<=n; i++)
    {
        ci=v[i];

        catidiv=0;
        for(j=1; j<=cateprime; j++)
        {
            if(prime[j]*prime[j]>ci) break;
            else
            {
                if(ci%prime[j]==0)
                {
                    catidiv++;
                    diviz[catidiv]=prime[j];
                    while(ci%prime[j]==0)
                    {
                        ci=ci/prime[j];

                    }

                }

            }
        }
        if(ci>1)
        {

            diviz[++catidiv]=ci;
        }
        int val=1<<catidiv;
        val--;
        int prod=1;
        for(j=1; j<=val; j++)
        {
            int cj=j;
            int parimp=0;
           int  prod=1;
            for(int d=catidiv; d>=1; d--)
            {
                if(cj%2==1)
                {
                    parimp++;
                    prod*=diviz[d];

                }
                cj/=2;
            }
            if(parimp%2==1)
            {
                sol+=n-fr[prod];
            }
            else
            {
                sol=sol-(n-fr[prod]);
            }
        }


    }
   sol/=2;
  g<<sol;




}