結果

問題 No.3735 Offbeat Permutation Tree
コンテスト
ユーザー Kurao
提出日時 2026-09-19 17:06:32
言語 PyPy3
(7.3.23 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 450 ms / 2,000 ms
+ 398µs
コード長 5,566 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 67 ms
コンパイル使用メモリ 83,280 KB
実行使用メモリ 161,480 KB
最終ジャッジ日時 2026-09-19 17:06:58
合計ジャッジ時間 11,122 ms
ジャッジサーバーID
(参考情報)
judge4_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

from __future__ import annotations
import sys
sys.setrecursionlimit(2*10**7)
#↓codon===============================
import string
Alp_low=list(string.ascii_lowercase)
Alp_up=list(string.ascii_uppercase)
Digit="0123456789"
dij=[[0,1],[1,0],[0,-1],[-1,0]]
def nin():
    return list(map(int,input().split()))
def deq(x):
    return [i-1 for i in x]
mod=998244353
_factorial=[1]
def factorial(n):
    while len(_factorial)<=n:
        _factorial.append((_factorial[-1]*len(_factorial))%mod)
    return _factorial[n]

_inv_factorial=[1]
def inv_factorial(n):
    while len(_inv_factorial)<=n:
        _inv_factorial.append((_inv_factorial[-1]*pow(len(_inv_factorial),mod-2,mod))%mod)
    return _inv_factorial[n]

def binom(n,r):
    if r>=mod:
        raise ValueError("r is too big")
    if n<0:
        return 0
    if r>n:
        return 0
    if r<0:
        return 0
    ans=((factorial(n)*inv_factorial(r))%mod*inv_factorial(n-r))%mod
    return ans

def main():
    n,=nin()
    if n==2 or n==3:
        print(-1)
        return
    def up(n):
        new=[]
        if n%2==0:
            for i in range(n+4):
                for j in range(n+4):
                    for di,dj in [(0,1),(1,0)]:
                        if not (0<=i+di<n+4 and 0<=j+dj<n+4):
                            continue
                        if 2<=i+di<n+2 and 2<=j+dj<n+2:
                            continue
                        if (i,i+di)==(0,1):
                            if j not in [0,3]:
                                new.append((i,j,i+di,j+dj))
                        elif (i,i+di)==(n+2,n+3):
                            new.append((i,j,i+di,j+dj))
                        elif (j,j+dj)==(0,1):
                            if i!=n+2:
                                new.append((i,j,i+di,j+dj))
                        elif (j,j+dj)==(n+2,n+3):
                            if i not in [1,n+3]:
                                new.append((i,j,i+di,j+dj))
                        elif i==0 and di==0:
                            if j==2 or (j%2==1 and 3<=j<=n+1):
                                new.append((i,j,i+di,j+dj))
                        elif i==1 and di==0:
                            if j%2==0 and 2<=j<=n:
                                new.append((i,j,i+di,j+dj))
                        elif j in [0,1] and dj==0:
                            if 1<=i<=n+1 and (i+j+1)%2==0:
                                new.append((i,j,i+di,j+dj))
                        elif i in [n+2,n+3] and di==0:
                            if 1<=j<=n+1 and (i+j)%2==0:
                                new.append((i,j,i+di,j+dj))
                        elif j in [n+2,n+3] and dj==0:
                            if 1<=i<=n+1 and (i+j)%2==0:
                                new.append((i,j,i+di,j+dj))
            new.append((1,3,2,3))
        else:
            for i in range(n+4):
                for j in range(n+4):
                    for di,dj in [(0,1),(1,0)]:
                        if not (0<=i+di<n+4 and 0<=j+dj<n+4):
                            continue
                        if 2<=i+di<n+2 and 2<=j+dj<n+2:
                            continue
                        if di==0:
                            if j==0:
                                new.append((i,j,i+di,j+dj))
                            elif j==n+2:
                                if i!=1:
                                    new.append((i,j,i+di,j+dj))
                            elif i in [0,1]:
                                if 2<=j<=n+1 and (i+j)%2==0:
                                    new.append((i,j,i+di,j+dj))
                            elif i in [n+2,n+3]:
                                if 1<=j<=n+1 and (i+j)%2==0:
                                    new.append((i,j,i+di,j+dj))
                        else:
                            if i==0:
                                if j!=0:
                                    new.append((i,j,i+di,j+dj))
                            elif i==n+2:
                                if j not in [1,n+2]:
                                    new.append((i,j,i+di,j+dj))
                            elif j in [0,1]:
                                if (i+j)%2==1:
                                    new.append((i,j,i+di,j+dj))
                            elif j in [n+2,n+3]:
                                if 1<=i<=n+1 and (i+j)%2==0:
                                    new.append((i,j,i+di,j+dj))
            new.append((1,2,2,2))
        return new
    now=[]
    temp=0
    if n%4==0:
        now=[(0, 0, 0, 1), (0, 2, 0, 3), (0, 0, 1, 0), (0, 1, 1, 1), (0, 3, 1, 3), (1, 1, 1, 2), (1, 2, 1, 3), (1, 2, 2, 2), (2, 0, 2, 1), (2, 2, 2, 3), (2, 0, 3, 0), (2, 2, 3, 2), (2, 3, 3, 3), (3, 0, 3, 1), (3, 1, 3, 2)]
        temp=4
    elif n%4==2:
        now=[(0,0,0,1),(1,0,1,1,),(1,0,2,0)]
        temp=2
    elif n%4==1:
        now=[]
        temp=1
    elif n%4==3:
        now=[
            (0,0,0,1),
            (0,1,1,1),
            (1,-1,1,0),
            (1,0,2,0),
            (0,2,1,2),
            (1,2,2,2),
            (2,1,2,2),
            (2,1,3,1)
        ]
        now=[(i,2-j,ii,2-jj) for i,j,ii,jj in now]
        temp=3
    final=[]
    while temp<=n:
        k=(n-temp)//2
        for i,j,ii,jj in now:
            if n%2==1 and (temp//4)%2==0:
                final.append((i+k,n-1-(j+k),ii+k,n-1-(jj+k)))
            else:
                final.append((i+k,j+k,ii+k,jj+k))
        now=up(temp)
        temp+=4
    for i,j,ii,jj in final:
        print(i*n+j+1,ii*n+jj+1)


if __name__=="__main__":
    main()
0