QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#854979#8706. 解方程hhoppitree100 ✓1139ms10316kbC++172.0kb2025-01-12 11:45:222025-01-12 11:45:26

Judging History

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

  • [2025-01-12 11:45:26]
  • 评测
  • 测评结果:100
  • 用时:1139ms
  • 内存:10316kb
  • [2025-01-12 11:45:22]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

long long P, a[6], b[6], c[6], ia1, L, B;

long long inv(long long a, long long b = P){
    return 1 < a ? b - (__int128)inv(b % a, a) * b / a : 1;
}

int check(long long x) {
    x = (__int128)(x + c[1] - L + P) * ia1 % P;
    if (!x) return 0;
    long long sq = sqrt(x), nw = x % sq;
    for (int i = 1; i <= 5; ++i) {
        if (((__int128)x * a[i] + (x % b[i] + 1) * nw) % P != c[i]) return 0;
        nw = (__int128)nw * x % sq;
    }
    printf("%lld\n", x);
    return 1;
}

pair<long long, int> o[1000005];

void calc(long long x, long long y, long long z) {
    z = (z - (__int128)(x - L) * y % P + P) % P;
    int r = 0;
    for (int i = 0; i < B; ++i) o[r++] = {(__int128)i * y % P, i};
    sort(o, o + r);
    o[r++] = {P + 5, 0};
    long long Y = (__int128)y * B % P, mul = (z - (__int128)Y * (B - 1) % P + P) % P;
    for (int i = B - 1; ; --i) {
        long long ctr = mul, tl = ctr - L, tr = ctr;
        if (tl < 0) tl += P;
        if (tl <= tr) {
            for (pair<long long, int> *j = lower_bound(o, o + r, make_pair(tl, 0)); j -> first <= tr; ++j) {
                if (check(i * B + j -> second)) return;
            }
        } else {
            for (pair<long long, int> *j = lower_bound(o, o + r, make_pair(tl, 0)); j != o + r; ++j) {
                if (check(i * B + j -> second)) return;
            }
            for (pair<long long, int> *j = 0; j -> first <= tr; ++j) {
                if (check(i * B + j -> second)) return;
            }
        }
        ((mul += Y) >= P) && (mul -= P);
    }
}

signed main() {
    int T; scanf("%d", &T);
    while (T--) {
        scanf("%*d%lld", &P), L = 0;
        for (int i = 1; i <= 5; ++i) {
            scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
            L = max(L, b[i]);
        }
        L *= 1000000000, B = sqrt(L) + 5;
        ia1 = inv(a[1]);
        calc(c[1], (__int128)a[2] * ia1 % P, c[2]);
    }
    return 0;
}

詳細信息

Subtask #1:

score: 15
Accepted

Test #1:

score: 15
Accepted
time: 68ms
memory: 4532kb

input:

40
5 923097614961380909
400075690252081333 1 336925156808111277
125871709464257940 1 69865713802049054
625686524906165721 1 231604442249496820
240111021937539825 1 466914943115931347
877342215923645363 1 405475742085577903
5 954878053655579819
314356765890269968 1 479476497512555507
3066762309305691...

output:

105920391906
517298493095
67193831219
454985828211
684359412322
641300692901
843969628814
441618717944
969809963928
839021293810
844536308194
864204489953
5716199622
878033311810
235677761660
860055517480
657591767649
831659873919
212006513628
404950041144
707100669788
697228408265
379537727517
1651...

result:

ok 40 lines

Subtask #2:

score: 10
Accepted

Test #2:

score: 10
Accepted
time: 68ms
memory: 4392kb

input:

40
5 923097614961380909
400075690252081333 1 36226200850654830
125871709464257940 1 801294848271831
625686524906165721 1 167289389520696370
240111021937539825 1 566782367688890103
877342215923645363 1 437769344508562455
5 954878053655579819
314356765890269968 1 481049707495526324
306676230930569168 ...

output:

78105920391906
5517298493095
10067193831219
17454985828211
61684359412322
54641300692901
15843969628814
53441618717944
9969809963928
44839021293810
82844536308194
2864204489953
61005716199622
40878033311810
16235677761660
62860055517480
22657591767649
831659873919
72212006513628
2404950041144
117071...

result:

ok 40 lines

Subtask #3:

score: 10
Accepted

Test #3:

score: 10
Accepted
time: 72ms
memory: 4532kb

input:

40
5 923097614961380909
400075690252081333 1 167001433276774274
125871709464257940 1 775646046137144068
625686524906165721 1 792747143363812162
240111021937539825 1 511005265275196004
877342215923645363 1 898824348527556482
5 954878053655579819
314356765890269968 1 501561843363742850
306676230930569...

output:

2678105920391906
3105517298493095
5110067193831219
7617454985828211
5261684359412322
6854641300692901
7315843969628814
7653441618717944
1409969809963928
3244839021293810
1082844536308194
4502864204489953
3961005716199622
8740878033311810
3916235677761660
4262860055517480
1722657591767649
45008316598...

result:

ok 40 lines

Subtask #4:

score: 15
Accepted

Test #4:

score: 15
Accepted
time: 104ms
memory: 4388kb

input:

40
5 923097614961380909
400075690252081333 1 711217741985470914
125871709464257940 1 444725029628910905
625686524906165721 1 74716258575747726
240111021937539825 1 409246477245810521
877342215923645363 1 369189987866325821
5 954878053655579819
314356765890269968 1 80576853778385871
30667623093056916...

output:

879580490959010998
903105517298493095
100961799682928291
922539371847228591
628493150920549456
265171336571026545
387315843969628814
156736640668952150
656175720394165068
32328038071528016
917985229574927286
174746756893330317
596886871960748158
28428545478913330
462999434727995866
16638432540308930...

result:

ok 40 lines

Subtask #5:

score: 25
Accepted

Test #5:

score: 25
Accepted
time: 263ms
memory: 6348kb

input:

40
5 923097614961380909
400075690252081333 6 711217743785736202
125871709464257940 6 444725031004785657
625686524906165721 3 74716259410497736
240111021937539825 9 409246477844369931
877342215923645363 10 369189993610199341
5 954878053655579819
314356765890269968 5 80576853778385871
3066762309305691...

output:

879580490959010998
903105517298493095
100961799682928291
922539371847228591
628493150920549456
265171336571026545
387315843969628814
156736640668952150
656175720394165068
32328038071528016
917985229574927286
174746756893330317
596886871960748158
28428545478913330
462999434727995866
16638432540308930...

result:

ok 40 lines

Subtask #6:

score: 25
Accepted

Test #6:

score: 25
Accepted
time: 1139ms
memory: 10316kb

input:

40
5 923097614961380909
400075690252081333 95 711217768089317590
125871709464257940 95 444725049579094809
625686524906165721 98 74716266923247826
240111021937539825 92 409246509568018661
877342215923645363 91 369190035253282361
5 954878053655579819
314356765890269968 96 80576904711097456
30667623093...

output:

879580490959010998
903105517298493095
100961799682928291
922539371847228591
628493150920549456
265171336571026545
387315843969628814
156736640668952150
656175720394165068
32328038071528016
917985229574927286
174746756893330317
596886871960748158
28428545478913330
462999434727995866
16638432540308930...

result:

ok 40 lines