func_code_string: #include <vector>   #include <algorithm>   #include <queue>   #include <iostream>   #include <string>   #include <stack>   #include <map>   #include <fstream>   #include <random>   #include <iomanip>    #include <set>   #include <cmath>   #include <cassert>   #include <unordered_set>   #include <unordered_map>   using namespace std;      typedef long long int ll;   typedef long double ld;      const ll INF = 1e10;         ll gcd(ll a, ll b) {    return (b == 0 ? a : gcd(b, a % b));   }         ll binpow(ll a, ll p) {    if (p == 0) return 1;    if (p % 2) {     ll b = binpow(a, p - 1);     return b * a;    }    else {     ll b = binpow(a, p / 2);     return b * b;    }   }         vector<ll> get_primes(ll size) {    vector<bool> is_pr(size, true);    vector<ll> pr;       is_pr[0] = is_pr[1] = false;       for (ll i = 0; i < size; i++) {     if (is_pr[i] == false) continue;        pr.push_back(i);     for (ll j = i *i ; j < size; j+=i)      is_pr[j] = false;    }       return pr;   }         int main() {    //ifstream cin( input.txt );    //ofstream cout( output.txt );       int t; cin >> t;       vector<ll> primes = get_primes(4000);    while (t--) {     int n, k;     cin >> n >> k;        vector<ll> arr(n);        for (int i = 0; i < n; i++) {      cin >> arr[i];         for (ll p : primes) {       while (arr[i] % (p * p) == 0 && arr[i] >= p * p) {        arr[i] /= (p * p);       }          if (arr[i] < p * p) break;      }     }        ll res = 1;     set<ll> elem = { arr[0] };     for (int i = 1; i < n; i++) {      if (elem.find(arr[i]) == elem.end()) {       elem.insert(arr[i]);      }      else {       elem.clear();       elem.insert(arr[i]);       res++;      }     }        cout << res << endl;    }             return 0;   }