結果
問題 | No.8014 多項式ハッシュに関する教育的な問題 |
ユーザー |
![]() |
提出日時 | 2022-08-08 19:00:01 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 32 ms / 5,000 ms |
コード長 | 3,014 bytes |
コンパイル時間 | 73 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 10,880 KB |
最終ジャッジ日時 | 2024-09-19 04:04:10 |
合計ジャッジ時間 | 609 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 1 |
ソースコード
import sysread=sys.stdin.buffer.readreadline=sys.stdin.buffer.readlinereadlines=sys.stdin.buffer.readlines# loop=0def LLL(b):k = 2kmax = 1n = len(b)m = len(b[0])d = [0] * (n+1)d[0] = 1d[1] = sum(b[0][_]*b[0][_] for _ in range(m))# H = [[1 if j==i else 0 for j in range(n)] for i in range(n)]lmd = [[0]*n for _ in range(n)]def RED(k, l):if -d[l]<=2*lmd[k-1][l-1] and 2*lmd[k-1][l-1]<=d[l]:returnq = (2*lmd[k-1][l-1]+d[l])//(2*d[l])# for i in range(n):# H[k-1][i] -= H[l-1][i]*qfor i in range(m):b[k-1][i] -= b[l-1][i]*qlmd[k-1][l-1] -= q*d[l]for i in range(l-1):lmd[k-1][i] -= q*lmd[l-1][i]def SWAP(k):# # swap(H[k], H[k-1])# for i in range(n):# tmp = H[k-1][i]# H[k-1][i] = H[k-2][i]# H[k-2][i] = tmp# swap(b[k], b[k-1])for i in range(m):tmp = b[k-1][i]b[k-1][i] = b[k-2][i]b[k-2][i] = tmpif k > 2:for j in range(1, k-1):tmp = lmd[k-1][j-1]lmd[k-1][j-1] = lmd[k-2][j-1]lmd[k-2][j-1] = tmpv = lmd[k-1][k-2]B = (d[k-2]*d[k]+v*v)//d[k-1]for i in range(k+1, kmax+1):t = lmd[i-1][k-1]lmd[i-1][k-1] = (d[k]*lmd[i-1][k-2]-v*t)//d[k-1]lmd[i-1][k-2] = (B*t+v*lmd[i-1][k-1])//d[k]d[k-1] = Bdef test_LLL_condition(k):# global loop# loop += 1RED(k, k-1)if 4*d[k]*d[k-2]<3*d[k-1]*d[k-1]-4*lmd[k-1][k-2]*lmd[k-1][k-2]:SWAP(k)if k > 2:k -= 1k = test_LLL_condition(k)else:for l in range(k-2, 0, -1):RED(k, l)k += 1return kwhile k <= n:if k <= kmax:k = test_LLL_condition(k)else:kmax = kfor j in range(1, k+1):u = sum(b[k-1][_]*b[j-1][_] for _ in range(m))for i in range(1, j):assert (d[i]*u-lmd[k-1][i-1]*lmd[j-1][i-1])%d[i-1]==0u = (d[i]*u-lmd[k-1][i-1]*lmd[j-1][i-1])//d[i-1]if j==k:d[k] = uassert d[k] != 0else:lmd[k-1][j-1] = u#print(loop)return bp=1000000000000000003b=123456789987654321n=12mat=[[0]*n for _ in range(n)]for i in range(n-1):mat[i][i]=-bmat[i][i+1] = 1mat[n-1][0]=pres=LLL(mat)[0]#print(res)s=[]t=[]for i in range(n):if res[i]>=0:s.append(chr(ord('a')+res[i]))t.append('a')else:t.append(chr(ord('a')-res[i]))s.append('a')s=''.join(s)t=''.join(t)hs=0ht=0for i in range(n):hs+=ord(s[i])*(b**i)ht+=ord(t[i])*(b**i)hs%=pht%=passert hs==htprint(s[::-1])print(t[::-1])