[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();
}
}