https://codeforces.com/contest/1497/problem/E1
시간 1초, 메모리 256MB
input :
output :
조건 :
모든 숫자에 대한 제곱수를 기록해둬야 한다.
1을 기준으로 봤을 때, 1 1 / 2 2 / 3 3/ ... / 10000000 10000000 까지의 수들은 이로 만들어진 두 수를 곱하면 제곱수가 된다. 맨 처음 1을 기준으로 잡았을 때 이 1도 다른 수에 1개 들어 있으니까.
그렇게 2, 3, 4, 5, ...., 10000000 까지 기록을 해서 모든 원소들을 비교해야 한다.
그래서 부분배열을 이루는 원소들의 기준들을 봤을 때 다 달라야 한다.
다르지 않다면 새로운 배열을 만든다.
어차피 연속적인 부분배열이기 때문에 처음 원소부터 끝까지 확인하면 된다.
hard의 경우에는 원소들을 재배치시키기도 하기 때문에 hard는 잘 모르겠다...(노력해보겠다.)
import sys
limit = 10000001
temp = [0] * limit
for i in range(1, limit):
if temp[i] != 0:
continue
temp[i] = i
# finding all the square number
j = 1
while i * j * j <= limit:
temp[i * j * j] = i
j += 1
for _ in range(int(sys.stdin.readline())):
n, k = map(int, sys.stdin.readline().split())
data = list(map(int, sys.stdin.readline().split()))
# if they have same number in temp list
# then if you multiply this two you'll get square number
# because they have same counts of number and trigger number(index i)
# will be multiply twice so it will be square number
now = set()
cnt = 1
for item in data:
if temp[item] in now:
now = set()
cnt += 1
now.add(temp[item])
print(cnt)