結果

問題 No.3567 Modulo Grid
コンテスト
ユーザー titia
提出日時 2026-06-14 03:43:31
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
RE  
実行時間 -
コード長 2,395 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 352 ms
コンパイル使用メモリ 85,248 KB
実行使用メモリ 301,972 KB
最終ジャッジ日時 2026-06-14 03:43:41
合計ジャッジ時間 6,943 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 RE * 1
other AC * 17 RE * 8
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys
input = sys.stdin.readline

# エラトステネスの篩を用いた素因数分解・約数列挙
MAX=3*10**5+10 # 使いたい最大値を指定

# Sieve[i]で、iの最も小さい1でない約数を返す。
Sieve=[i for i in range(MAX)]

for i in range(2,MAX):
    if Sieve[i]!=i:
        continue
    
    for j in range(i,MAX,i):
        if Sieve[j]==j:
            Sieve[j]=i


# 素因数分解
def fact(x):
    D=dict()
    while x!=1:
        k=Sieve[x]
        if k in D:
            D[k]+=1
        else:
            D[k]=1
        x//=k
    return D

# 約数列挙
def faclist(x):
    LIST=[1]
    while x!=1:
        k=Sieve[x]
        count=0
        while x%k==0:
            count+=1
            x//=k

        LIST2=[]
        for l in LIST:
            for i in range(1,count+1):
                LIST2.append(l*k**i)
        LIST+=LIST2

    return LIST


H,W=list(map(int,input().split()))

flag=0
if H<W:
    flag=1
    H,W=W,H

a=H*W

F=fact(H*W)
FLIST=faclist(H*W)

FLIST.sort()
A=list(range(1,H*W+1))
LIST=[[] for i in range(len(FLIST))]

for i in range(len(FLIST)-1,-1,-1):
        x=FLIST[i]
        LIST1=[]
        B=[]
        for a in A:
            if a%x==0:
                LIST1.append(a)
            else:
                B.append(a)
        LIST[i]=(LIST1)
        A=B

#print(FLIST)
#print(LIST)


F=fact(H*W)

NOW=[1]
for f in F:
    k=F[f]

    X=[1]
    for i in range(k):
        X.append(X[-1]*f)

    X.reverse()

    NOW2=[]

    for x in X:
        L=[]
        for a in NOW:
            L.append(a*x)
        L.reverse()
        NOW2.append(L)

    NOW2.reverse()

    NOW=[]

    for x in NOW2:
        NOW+=x

    #print(NOW)

NOW.reverse()

D={FLIST[i]:i for i in range(len(FLIST))}

ANS=[[0]*W for i in range(H)]

height=0
for c in NOW:
    w=0
    L=D[c]
    if c==1:
        height+=1
        continue
    #print("!",LIST[L])
    for x in LIST[L]:
        if ANS[height][w]!=0:
            height+=1
        ANS[height][w]=x
        w+=1
        if w==W:
            w=0
    height+=2

ind=0

for i in range(H):
    for j in range(W):
        if ANS[i][j]==0:
            ANS[i][j]=LIST[0][ind]
            ind+=1

if flag:
    ANS2=[[0]*H for i in range(W)]

    for i in range(W):
        for j in range(H):
            ANS2[i][j]=ANS[j][i]

    ANS=ANS2

for ans in ANS:
    print(*ans)


    
    

                
        
0