数论精选

数论精选

G. Skibidus and Capping

rating:1700

https://codeforces.com/problemset/problem/2065/G

评述

结论都推出来了,竟然没想到怎么写,看了jiangly的代码恍然大悟

代码

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
std::vector<int> minp, primes;

void sieve(int n) {
    minp.assign(n + 1, 0);
    primes.clear();
    
    for (int i = 2; i <= n; i++) {
        if (minp[i] == 0) {
            minp[i] = i;
            primes.push_back(i);
        }
        
        for (auto p : primes) {
            if (i * p > n) {
                break;
            }
            minp[i * p] = p;
            if (p == minp[i]) {
                break;
            }
        }
    }
}

void solve() {
    int n;
    std::cin >> n;
    
    std::vector<int> a(n);
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
    
    std::sort(a.begin(), a.end());
    std::vector<int> cnt(n + 1);
    
    int cntp = 0;
    sieve(n);
    
    i64 ans = 0;
    
    for (auto x : a) {
        int p = minp[x];
        if (x == p) {
            ans += cntp - cnt[p];
            cntp++;
            cnt[p]++;
        } else {
            int q = minp[x / p];
            if (x != p * q) {
                continue;
            }
            ans++;
            if (p == q) {
                ans += cnt[x];
                ans += cnt[p];
            } else {
                ans += cnt[x];
                ans += cnt[p];
                ans += cnt[q];
            }
            cnt[x]++;
        }
    }
    
    std::cout << ans << "\n";
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t;
    std::cin >> t;
    
    while (t--) {
        solve();
    }
    
    return 0;
}
posted @ 2025-04-04 17:12  califeee  阅读(5)  评论(0)    收藏  举报