[CF1497E1] Square-free division (easy version) - hash

Description

给出一串长为 \(n\) 的序列 \(a_1,a_2,a_3...a_n\)。把它分成尽量少的块使每一块中任意两数的乘积不是一个完全平方数。输出最少的块数。

Solution

matter 的只有每个因子出现次数的奇偶性

因此想到对每个因子出现次数奇偶性生成 hash(实际上把出现奇数次的因子乘起来就可以了)

然后贪心去做,每次做到集合中有 hashcode 和新元素相同,就开新段

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e7 + 5;
bool isprime[N];
vector<int> primes;

void prepare()
{
    memset(isprime, 1, sizeof isprime);
    isprime[1] = 0;
    for (int i = 2; i < N; i++)
    {
        if (isprime[i])
        {
            primes.push_back(i);
            for (int j = i * i; j < N; j += i)
                isprime[j] = 0;
        }
    }
}

int gethash(int x)
{
    map<int, int> mp;
    for (int i = 2; i * i <= x; i++)
    {
        while (x % i == 0)
        {
            x /= i;
            mp[i]++;
        }
    }
    if (x > 1)
        mp[x]++;
    int ans = 1;
    for (auto [x, y] : mp)
    {
        if (y & 1)
            ans *= x;
    }
    return ans;
}

void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int ans = 1;
    set<int> s;
    for (int i = 1; i <= n; i++)
    {
        int hs = gethash(a[i]);
        if (s.find(hs) != s.end())
        {
            ++ans;
            s.clear();
        }
        s.insert(hs);
    }
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
}

相关文章:

  • 2021-08-31
  • 2021-04-30
  • 2021-06-28
  • 2021-09-23
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
  • 2021-10-01
猜你喜欢
  • 2022-01-11
  • 2021-07-12
  • 2022-12-23
  • 2021-10-06
  • 2022-03-08
  • 2022-01-16
  • 2022-12-23
相关资源
相似解决方案