QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#107349#6126. Sequence and SequencemaspyAC ✓940ms13560kbPython32.0kb2023-05-21 01:52:292023-05-21 01:52:31

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-21 01:52:31]
  • 评测
  • 测评结果:AC
  • 用时:940ms
  • 内存:13560kb
  • [2023-05-21 01:52:29]
  • 提交

answer

from math import isqrt

K = 100000

C = [[0] * 100 for _ in range(100)]
C[0][0] = 1
for i in range(99):
    for j in range(99):
        C[i + 1][j] += C[i][j]
        C[i + 1][j + 1] += C[i][j]


P = []
for x in range(K):
    P += [x] * (x + 1)
    if len(P) >= K:
        break

Q = [0] * K
Q[1] = 1
for n in range(2, K):
    Q[n] = Q[n - 1] + Q[P[n]]


def lagrange_interpolate_iota(f, x):
    n = len(f)
    f = f.copy()
    a = [0] * n
    for i in range(n):
        a[i] = f[i]
        for j in range(i, n):
            f[j] -= a[i] * C[j][i]
    comb = 1
    res = 0
    for i in range(n):
        res += a[i] * comb
        comb = comb * (x - i) // (1 + i)
    return res


FF = []
FF.append([1])
AA = []

for i in range(5):
    f = FF[i]
    g = [0] + f
    for i in range(1, len(g)):
        g[i] += g[i - 1]
    f = [lagrange_interpolate_iota(g, x * (x + 1) // 2)
         for x in range(2 * len(g) - 1)]
    FF.append(f)

for f in FF:
    g = [0] + f
    for i in range(1, len(g)):
        g[i] += g[i - 1]
    f = g
    n = len(f)
    a = [0] * n
    for i in range(n):
        a[i] = f[i]
        for j in range(i, n):
            f[j] -= a[i] * C[j][i]
    AA.append(a)


def newton(idx, x):
    a = AA[idx]
    comb = 1
    res = 0
    for i, v in enumerate(a):
        res += v * comb
        comb = comb * (x - i) // (1 + i)
    return res


def calc_sum(f_idx, n):
    # sum_{i=0}^n f(i)Q(i)
    f = FF[f_idx]
    if n < len(f):
        res = 0
        for i in range(n + 1):
            res += f[i] * Q[P[i]]
        return res
    ANS = 0
    ANS += newton(f_idx, n + 1) * calc_Q(calc_P(n))
    k = isqrt(8 * n + 1)
    k = (k - 1) // 2
    ANS -= calc_sum(f_idx + 1, k)
    return ANS


def calc_P(n):
    k = isqrt(8 * n + 1)
    return (k - 1) // 2


def calc_Q(n):
    if n < K:
        return Q[n]
    return calc_sum(0, n)


T = int(input())
for _ in range(T):
    N = int(input())
    print(calc_Q(N))

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 49ms
memory: 13508kb

input:

4
10
100
1000
987654321123456789

output:

30
2522
244274
235139898689017607381017686096176798

result:

ok 4 lines

Test #2:

score: 0
Accepted
time: 374ms
memory: 13388kb

input:

10000
613939207402503646
408978283345333197
976677512231308716
629053280913850466
148712339
236220313279945487
590396556995977994
9226
215693877607285701
649702683896705
343173887453826567
847003949499596615
867133040287550291
159928123569892354
864534948175618654
209739383170746721
4295456752378791...

output:

91030728117067063595428375419346402
40469246710473908695676971059074376
229951682342450470520349294486964970
95558039501640054006660579352994194
5418340556433412
13536357243714243974772906966693552
84197207203086091733385317631619504
20934656
11291075621624104092841708040651034
104019777231815308683...

result:

ok 10000 lines

Test #3:

score: 0
Accepted
time: 144ms
memory: 13560kb

input:

1000
6403632579734162001008235137760132245297
1307698664787972023762442022139627469666
668870338048562416595095770565441759482
5092270
8806864498496723812760785099973409980711
2178464116010775202899984038946879469187
204381824371
8638495456004772442511643693521120926431
45954412333082528168092594892...

output:

9822905445826021159291522774438593145331066315784567505849706373529921001845336
409552844852728078841401625660602682494169687360338453221088647649526339235330
107160056181509722327918304399871120167096186888511567354513496578559803370274
6354453295964
185817323129718525790559571287806776421589155460...

result:

ok 1000 lines

Test #4:

score: 0
Accepted
time: 199ms
memory: 13444kb

input:

2000
2587627816607030340103003175959756184662
7728753705064569253253827797978613582938
6507847628603052973674714721
6989857636824717968431061258300652290539
4734281027640913533293237760425416005062
9411123735455625690768098631226366597446
8309753930995253536640660321476246470149
63565157427098067709...

output:

1603610451790269237852635641930301658193367441164307312552842461667027137613454
14309943493171496191506053530749878345271155973702143153225815632926701434642842
10414697803791950572309383355053080338229465674803757518
11704102206894264239190418551798088411458157423624785417336589284698838535371266
5...

result:

ok 2000 lines

Test #5:

score: 0
Accepted
time: 485ms
memory: 13396kb

input:

5000
6701025283447923273597553918313900029215
1618190467906965189844764312914748628527
2135261797018456059451326428589353332126
8027429917075086154217136768450383650445
8263301530632040969183919589286944799002
376886964626613356031779878
1191561726595055348898524031899625958102
453561433135467095374...

output:

10756647971303093856509780939435968749671842310025383400207261624750784751725876
627115945498078452730193858129037650151913122482133071938783012929533045529940
1091921493223233296724616654299408127388059493196845968361252389122720100379070
154375707400033063668088306493199269136326791073281723548116...

result:

ok 5000 lines

Test #6:

score: 0
Accepted
time: 940ms
memory: 13432kb

input:

10000
260865660295317278841
5232352637620496342310336202478387251106
7108789244285764135987032973912918380
12766535319519586095540974948550152061
5138306300154916887884637635208203681949
7603163140266839847784708214115317398585
149590294591155205497765668766786424787
63283557694500045989299147454323...

output:

16323111740957704392106241109891718054228
6557703685144914472554701877112177422100848067214049191882271294010013621817762
12143115079716078114619105501427985631361994195400195527663921137836417758
39139456824156526604158618001888125076786817219954316014947704612553450312
6324051018379978443719363340...

result:

ok 10000 lines