Cod sursa(job #3305873)

Utilizator divadddDavid Curca divaddd Data 5 august 2025 20:38:05
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+2;
const int VMAX = 1e6+2;
const int PMAX = 1e3+2;
int n,v[NMAX],cnt[VMAX],vf[VMAX];
bool ciur[PMAX];
vector<int> primes;

ifstream fin("pairs.in");
ofstream fout("pairs.out");

vector<int> factorise(int x){
  vector<int> ans;
  int idx = 0;
  while(x > 1 && primes[idx]*primes[idx] <= x && idx < (int)primes.size()){
    int exp = 0;
    while(x%primes[idx] == 0){
      exp++;
      x /= primes[idx];
    }
    if(exp > 0){
      ans.push_back(primes[idx]);
    }
    idx++;
  }
  if(x > 1){
    ans.push_back(x);
  }
  return ans;
}

int main(){
  for(int i = 2; i < PMAX; i++){
    if(ciur[i] == 0){
      primes.push_back(i);
      for(int j = 2*i; j < PMAX; j += i){
        ciur[j] = 1;
      }
    }
  }

  fin >> n;
  for(int i = 1; i <= n; i++){
    fin >> v[i];
    cnt[v[i]]++;
  }

  for(int i = 2; i < VMAX; i++){
    for(int j = 2*i; j < VMAX; j += i){
      cnt[i] += cnt[j];
    }
  }

  long long ans = 0;
  for(int i = 1; i <= n; i++){
    vector<int> fact = factorise(v[i]);
    int contrib = n-1, nrf = fact.size();
    for(int mask = 0; mask < (1<<nrf); mask++){
      int prod = 1;
      for(int j = 0; j < nrf; j++){
        int bt = (mask>>j)&1;
        prod *= (bt ? fact[j] : 1);
      }
      int coef = (__builtin_popcount(mask)%2 ? -1 : 1);
      contrib += coef * (cnt[prod] - 1);
    }
    ans += contrib;
  }
  fout << ans;
  return 0;
}