Cod sursa(job #3288348)

Utilizator mariusharabariMarius Harabari mariusharabari Data 21 martie 2025 17:45:24
Problema Indep Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>
using namespace std;

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

const int MOD=1e9+7, MAXA=1001;

int main(){
    int n;
    fin>>n;
    vector <int> v(n);
    for(int i=0;i<n;i++)
        fin>>v[i];

    vector <int> cmmdp(MAXA);
    iota(cmmdp.begin(), cmmdp.end(), 0);
    for(int i=2;i*i<MAXA;i++)
        if(cmmdp[i]==i)
            for(int j=i*i;j<=MAXA;j+=i)
                if(cmmdp[j]==j)
                    cmmdp[j]=i;

    vector <int> mu(MAXA);
    mu[1]=1;
    for(int d=2;d<MAXA;d++){
        int x=d, div=0;
        bool sq=0;
        while(x!=1){
            int p=cmmdp[x], cnt=0;
            while(x%p==0){
                x/=p;
                cnt++;
            }
            if(cnt>1){
                sq=1;
                break;
            }
            div++;
        }
        if(sq)
            mu[d]=0;
        else if(div%2==0)
            mu[d]=1;
        else
            mu[d]=-1;

        //cout<<d<< ' '<<mu[d]<<endl;
    }

    vector <int> counter(MAXA, 0);
    for(int d=1;d<MAXA;d++)
        for(int i:v)
            if(i%d==0)
                counter[d]++;

    vector <long long> pow2(n+1);
    pow2[0]=1;
    for(int i=1;i<=n;i++){
        pow2[i]=(pow2[i-1]*2)%MOD;
    }

    long long rez=0;
    for(int d=1;d<MAXA;d++){
        if(mu[d]==0) continue;
        if(counter[d]==0) continue;

        long long a=(pow2[counter[d]]-1)%MOD;
        a=a*mu[d]%MOD;
        rez=(rez+a)%MOD;
        //cout<<a<<' '<<rez<<endl;
    }
    fout<<rez;
    return 0;
}