Matrix is Fun#13036

Matrix is Fun (Розбір)

Автор задачі:

Hasan Saleh (MathModel)

Підготовлено:

Hasan Saleh (MathModel)

Відредаговано:

Hasan Saleh (MathModel)

Розв'язок Зсуви ніколи не змішують стовпці, тож кожен стовпець незалежний. Стовпець має в підсумку містити j+1,\,j+1+m,\,\dots,\,j+1+(n-1)m, а циклічний зсув лише зберігає циклічний порядок, тому він є Perfect тоді й лише тоді, коли є ротацією цієї прогресії. Якщо повернути мінімальний елемент нагору, це канонізує стовпець, тож достатньо й необхідно перевірити, що всі сусідні різниці дорівнюють і що (col_0-1)\bmod m=j. Складність O(n\cdot m).

def solve():
    n,m=map(int,input().split())
    a=[list(map(int,input().split())) for _ in range(n)]
    ans=0
    for j in range(m):
        col=[a[i][j] for i in range(n)]
        p=min(range(n),key=col.__getitem__)
        col=col[p:]+col[:p]
        ok=((col[0]-1)%m==j and all(col[i+1]-col[i]==m for i in range(n-1)))
        if(ok):
            ans+=1
    print(ans)
        
for _ in range(int(input())):
    solve()