Cod sursa(job #2534716)

Utilizator RazvanPanaiteRazvan Panaite RazvanPanaite Data 30 ianuarie 2020 21:20:36
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
#define pb push_back

using namespace std;

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

void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H; debug_out(T...);}
#define dbg(...) cerr << #__VA_ARGS__ << " ->", debug_out(__VA_ARGS__)
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"

typedef pair<int,int> pii;
typedef long long int ll;
typedef long double ld;

const int DMAX = 1e6+10;

vector <int> prime;

int V[DMAX];
int cates[DMAX];
bool uz[DMAX];

pii dp[32000];

int n;
ll sol;

void ciur();

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t,i,j,d,cate,mask,mask2,pos,ans;

    fin>>n;
    for(i=1;i<=n;i++)
        fin>>V[i];

    ciur();
    for(i=1;i<=n;i++){
        vector <int> div;
        for(d=0;d < prime.size() && 1LL*prime[d]*prime[d] <= V[i];d++)
            if(V[i] % prime[d] == 0){
                while(V[i] % prime[d] == 0)
                    V[i]/=prime[d];
                div.pb(prime[d]);
            }
        if(V[i] > 1)
            div.pb(V[i]);

        cate=div.size();
        dp[0].first=1;
        ans=0;
        for(mask=1;mask < (1<<cate);mask++)
            for(pos=0;pos < cate;pos++)
                if(mask & (1<<pos)){
                    mask2=mask^(1<<pos);
                    dp[mask].first=dp[mask2].first*div[pos];
                    dp[mask].second=dp[mask2].second+1;

                    if(dp[mask].second & 1)
                        ans+=cates[dp[mask].first];
                    else
                        ans-=cates[dp[mask].first];
                    cates[dp[mask].first]++;
                    break;
                }
        sol+=(i-1-ans);
    }
    fout<<sol<<'\n';

    return 0;
}
void ciur(){
    ll i,j;
    for(i=2;i*i <= (int) 1e6;i++)
        if(!uz[i]){
            prime.pb(i);
            uz[i]=1;
            for(j=i*i;j <= (int) 1e6;j+=i)
                uz[j]=true;
        }
    for( ;i <= (int) 1e6;i++)
        if(!uz[i])
           prime.pb(i);
}