QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#878335#9690. Iron Warriorucup-team3646#AC ✓129ms9216kbPython33.9kb2025-02-01 14:49:482025-02-01 14:49:49

Judging History

This is the latest submission verdict.

  • [2025-02-01 14:49:49]
  • Judged
  • Verdict: AC
  • Time: 129ms
  • Memory: 9216kb
  • [2025-02-01 14:49:48]
  • Submitted

answer

S=4
def mul(A,B):
  C=[[0]*S for i in range(S)]
  for i in range(S):
    for k in range(i,S):
      for j in range(k,S):
        C[i][j]+=A[i][k]*B[k][j]
  return C

E=[[0]*S for i in range(S)]
for i in range(S):
  E[i][i]=1
def matpow(A,k):
  if k==0:
    return E
  if k&1:
    return mul(A,matpow(A,k-1))
  B=matpow(A,k//2)
  return mul(B,B)

MA=[[int(i==j) for j in range(S)] for i in range(S)]
MB=[[int(i==j) for j in range(S)] for i in range(S)]
MC=[[int(i==j) for j in range(S)] for i in range(S)]
MD=[[int(i==j) for j in range(S)] for i in range(S)]
MA[2][3]=5
MB[1][3]=11
MC[0][3]=10
MC[1][2]=1
MD[0][1]=1
MD[1][2]=1

M_CBA=mul(MA,mul(MB,MC))
M_CBD=mul(MD,mul(MB,MC))

M_ABA=mul(MA,mul(MB,MA))
M_AD=mul(MD,MA)
M_CD=mul(MD,MC)
M_BD=mul(MD,MB)

POW_CBA=[M_CBA]
for i in range(1,60):
  POW_CBA.append(mul(POW_CBA[-1],POW_CBA[-1]))

POW_CBD=[M_CBD]
for i in range(1,60):
  POW_CBD.append(mul(POW_CBD[-1],POW_CBD[-1]))

def calc_CBA(turn):
  X=E
  for i in range(60):
    if (turn>>i)&1:
      X=mul(X,POW_CBA[i])
  return X

def calc_CBD(turn):
  X=E
  for i in range(60):
    if (turn>>i)&1:
      X=mul(X,POW_CBD[i])
  return X

def calc(x,y):
  return mul(calc_CBD(y),calc_CBA(x))

for _ in range(1):
  n=int(input())
  if n==1:
    print(20)
    exit()
  ans=0

  for t in range(3):
    if t!=0 and n>20:
      continue
    if t==0:
      M_ABA=mul(MA,mul(MB,MA))
    elif t==1:
      M_ABA=mul(MD,mul(MB,MA))
    else:
      M_ABA=mul(MB,mul(MD,MA))
    if n%2==1:
      ans=max(ans,mul(MD,mul(calc_CBA(n//2),M_ABA))[0][3])
    else:
      ans=max(ans,mul(MD,mul(calc_CBA(n//2),M_AD))[0][3])

    if n%2==1:
      L=-1
      R=n//2+1
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(calc(nL,n//2-nL),M_ABA)[0][3]
        vR=mul(calc(nR,n//2-nR),M_ABA)[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2+1)):
        ans=max(ans,mul(calc(i,n//2-i),M_ABA)[0][3])

      L=-1
      R=n//2+1
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(M_CD,mul(calc(nL,n//2-nL),M_AD))[0][3]
        vR=mul(M_CD,mul(calc(nR,n//2-nR),M_AD))[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2+1)):
        ans=max(ans,mul(M_CD,mul(calc(i,n//2-i),M_AD))[0][3])

      L=-1
      R=n//2+1
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(M_BD,mul(calc(nL,n//2-nL),M_AD))[0][3]
        vR=mul(M_BD,mul(calc(nR,n//2-nR),M_AD))[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2+1)):
        ans=max(ans,mul(M_BD,mul(calc(i,n//2-i),M_AD))[0][3])

    else:
      L=-1
      R=n//2+1
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(calc(nL,n//2-nL),M_AD)[0][3]
        vR=mul(calc(nR,n//2-nR),M_AD)[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2+1)):
        ans=max(ans,mul(calc(i,n//2-i),M_AD)[0][3])

      L=-1
      R=n//2
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(M_CD,mul(calc(nL,n//2-nL-1),M_ABA))[0][3]
        vR=mul(M_CD,mul(calc(nR,n//2-nR-1),M_ABA))[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2)):
        ans=max(ans,mul(M_CD,mul(calc(i,n//2-i-1),M_ABA))[0][3])

      L=-1
      R=n//2
      while R-L>2:
        nL=(L+L+R)//3
        nR=(L+R+R)//3
        vL=mul(M_BD,mul(calc(nL,n//2-nL-1),M_ABA))[0][3]
        vR=mul(M_BD,mul(calc(nR,n//2-nR-1),M_ABA))[0][3]
        if vL>vR:
          R=nR
        else:
          L=nL
      for i in range(max(0,L),min(R+1,n//2)):
        ans=max(ans,mul(M_BD,mul(calc(i,n//2-i-1),M_ABA))[0][3])

  print(ans)

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

score: 100
Accepted
time: 10ms
memory: 8960kb

input:

1

output:

20

result:

ok answer is '20'

Test #2:

score: 0
Accepted
time: 11ms
memory: 9088kb

input:

3

output:

72

result:

ok answer is '72'

Test #3:

score: 0
Accepted
time: 12ms
memory: 9216kb

input:

4

output:

105

result:

ok answer is '105'

Test #4:

score: 0
Accepted
time: 11ms
memory: 9088kb

input:

5

output:

145

result:

ok answer is '145'

Test #5:

score: 0
Accepted
time: 12ms
memory: 9088kb

input:

6

output:

208

result:

ok answer is '208'

Test #6:

score: 0
Accepted
time: 12ms
memory: 9216kb

input:

7

output:

248

result:

ok answer is '248'

Test #7:

score: 0
Accepted
time: 12ms
memory: 9216kb

input:

8

output:

343

result:

ok answer is '343'

Test #8:

score: 0
Accepted
time: 20ms
memory: 9088kb

input:

486036

output:

13810882446441423

result:

ok answer is '13810882446441423'

Test #9:

score: 0
Accepted
time: 21ms
memory: 9216kb

input:

857503

output:

75842693981321486

result:

ok answer is '75842693981321486'

Test #10:

score: 0
Accepted
time: 25ms
memory: 9088kb

input:

459087

output:

11638561802272893

result:

ok answer is '11638561802272893'

Test #11:

score: 0
Accepted
time: 22ms
memory: 9216kb

input:

326354

output:

4181111331905669

result:

ok answer is '4181111331905669'

Test #12:

score: 0
Accepted
time: 24ms
memory: 9216kb

input:

755041

output:

51774938180590304

result:

ok answer is '51774938180590304'

Test #13:

score: 0
Accepted
time: 26ms
memory: 9216kb

input:

1000000

output:

120283726342420340

result:

ok answer is '120283726342420340'

Test #14:

score: 0
Accepted
time: 39ms
memory: 9216kb

input:

562451495

output:

21401951468280078633294014

result:

ok answer is '21401951468280078633294014'

Test #15:

score: 0
Accepted
time: 33ms
memory: 9088kb

input:

100214615

output:

121057415160393160185480

result:

ok answer is '121057415160393160185480'

Test #16:

score: 0
Accepted
time: 38ms
memory: 9216kb

input:

726997959

output:

46216571009844858875968944

result:

ok answer is '46216571009844858875968944'

Test #17:

score: 0
Accepted
time: 42ms
memory: 9216kb

input:

883477562

output:

82943950684199531529718356

result:

ok answer is '82943950684199531529718356'

Test #18:

score: 0
Accepted
time: 37ms
memory: 9088kb

input:

456878752

output:

11470993586298146794567272

result:

ok answer is '11470993586298146794567272'

Test #19:

score: 0
Accepted
time: 39ms
memory: 9216kb

input:

1000000000

output:

120281308501417045326995605

result:

ok answer is '120281308501417045326995605'

Test #20:

score: 0
Accepted
time: 128ms
memory: 9216kb

input:

151798318021627311

output:

420725672820572820226091469784149314525410684999074

result:

ok answer is '420725672820572820226091469784149314525410684999074'

Test #21:

score: 0
Accepted
time: 126ms
memory: 9088kb

input:

466154514052238226

output:

12183941850211915347991952173009567537536253846445099

result:

ok answer is '12183941850211915347991952173009567537536253846445099'

Test #22:

score: 0
Accepted
time: 117ms
memory: 9216kb

input:

262261097390039057

output:

2169700342816432479937347535029836266637820523889883

result:

ok answer is '2169700342816432479937347535029836266637820523889883'

Test #23:

score: 0
Accepted
time: 114ms
memory: 9088kb

input:

409768988622482114

output:

8275903133852517858111731626726122320253985666412809

result:

ok answer is '8275903133852517858111731626726122320253985666412809'

Test #24:

score: 0
Accepted
time: 129ms
memory: 9088kb

input:

361773749401383499

output:

5695204039674250675619463634360070429230287130689713

result:

ok answer is '5695204039674250675619463634360070429230287130689713'

Test #25:

score: 0
Accepted
time: 125ms
memory: 9088kb

input:

1000000000000000000

output:

120281306081172036692984324273260313737335405903162447

result:

ok answer is '120281306081172036692984324273260313737335405903162447'

Extra Test:

score: 0
Extra Test Passed