Submission #39

Details and source code

Back to submissions
IDTimeUserProblemLangVerdict
39Apr 14, 2025, 12:54 PMadminGCD Subset ChallengecppAC

Source Code

cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1000000007;
 
ll modexp(ll base, ll exp) {
    ll res = 1;
    while(exp) {
        if(exp & 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp >>= 1;
    }
    return res;
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n; cin >> n;
    vector<int> arr(n);
    int m = 0;
    for (int i = 0; i < n; i++){
        cin >> arr[i];
        m = max(m, arr[i]);
    }
    vector<int> freq(m+1, 0);
    for(auto &x : arr) freq[x]++;
 
    vector<int> cnt(m+1, 0);
    for(int d = 1; d <= m; d++){
        for(int j = d; j <= m; j += d){
            cnt[d] += freq[j];
        }
    }
 
    vector<ll> f(m+1, 0);
    for(int d = 1; d <= m; d++){
        if(cnt[d]) f[d] = (modexp(2, cnt[d]) - 1 + MOD) % MOD;
    }
 
    vector<int> mu(m+1, 1), isComposite(m+1, 0), primes;
    for(int i = 2; i <= m; i++){
        if(!isComposite[i]){
            primes.push_back(i);
            mu[i] = -1;
        }
        for(auto p : primes){
            if(i * p > m) break;
            isComposite[i*p] = 1;
            if(i % p == 0){
                mu[i*p] = 0;
                break;
            } else {
                mu[i*p] = -mu[i];
            }
        }
    }
 
    ll ans = 0;
    for(int d = 1; d <= m; d++){
        ans = (ans + mu[d] * f[d]) % MOD;
    }
    if(ans < 0) ans += MOD;
    cout << ans;
    return 0;
}