Cod sursa(job #2263249)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 18 octombrie 2018 15:16:23
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define VMAX 1000010
#define MAX 100010
#define PMAX 10
#define x first
#define y second

using namespace std;
typedef long long ll;

int n,a,sz;
int pd[VMAX],nrm[VMAX];
ll d[VMAX];
pair<int,int> dp[PMAX];
bitset<VMAX> prim;
void ciur(){
  prim.set();
  prim[0]=prim[1]=0;
  for(int i=2;i<VMAX;i++)
    if(prim[i]){
      pd[i]=i;
      for(ll j=(ll)i*i;j<VMAX;j+=i)
        if(prim[j])
          prim[j]=0,
          pd[j]=i;
    }
}
void bkt(int nra,int nr,int ce){
  if(nra==sz){
    if(ce==0)nrm[nr]++;
    else if(ce!=nr)d[nr]-=d[ce];
    return;
  }
  for(int i=0,p=1;i<=dp[nra+1].y;i++,p*=dp[nra+1].x)
    bkt(nra+1,nr*p,ce);
}
void marcheazadiv(int nr,int ce){
  sz=0;
  while(nr!=1){
    int da=pd[nr],exp=0;
    while(nr%da==0)nr/=da,exp++;
    dp[++sz]=make_pair(da,exp);
  }
  bkt(0,1,ce);
}

int main()
{
    ifstream f ("pairs.in");
    ofstream g ("pairs.out");
    ciur();
    f>>n;
    for(int i=1;i<=n;i++) f>>a,marcheazadiv(a,0);
    for(int i=VMAX-1;i>=1;i--){
      d[i]+=(ll)nrm[i]*(nrm[i]-1)/2;
      if(d[i]!=0)marcheazadiv(i,i);
    }
    g<<d[1];
    f.close ();
    g.close ();
    return 0;
}