求调
查看原帖
求调
862824
chenchhhhhh楼主2024/3/21 11:40
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define Acode ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int long long
const int N = 1e6 + 10;
int a[N];
map<int, int> mp1;
map<int, int> mp;
int s[N];
int vis[N], idx, p[N];

int qpow(long long a, long long b)
{
    int ans = 1;
    int k = a;
    while (b)
    {
        if (b & 1)
            ans = ans * k;
        k = k * k;
        b >>= 1;
    }
    return ans;
}

void get_primes(int n) // 一共有idx个素数,存在p数组里
{
    vis[1] = 1;
    for (int i = 2; i <= N; ++i)
    {
        if (!vis[i])
        {
            p[++idx] = i; // p代表第idx个素数是i;
            mp1[i] = idx;
        }
        for (int j = 1; j <= idx && p[j] * i <= n; ++j)
        {
            vis[p[j] * i] = 1;
            if (i % p[j] == 0)
                break;
        }
    }
}

void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int ans = 0;
    int sum = 0;
    for (int i = 1; i <= n; i++)
    {
        int x = a[i];
        if (x == 0)
        {
            ans += n - (sum + 1);
            sum++;
            continue;
        }
        vector<int> f;
        for (int j = 2; j * j <= x; j++)
        {
            int cnt = 0;
            if (x % j)
                continue;
            while (x % j == 0)
            {
                x /= j;
                cnt++;
            }
            if (cnt & 1)
                f.push_back(j);
        }
        if (x != 1)
            f.push_back(x);
        int res = 0;
        for (auto it : f)
        {
            int w = mp1[it];
            int x = qpow(2LL, w);
            res += x;
        }
        ans += mp[res];
        mp[res]++;
    }
    cout << ans << endl;
}

signed main()
{
    Acode;
    get_primes(2e5 + 10);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}
2024/3/21 11:40
加载中...