QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#5829#273. 类欧几里得算法Qingyu100 ✓17ms3676kbC++175.7kb2021-01-22 00:10:512021-12-19 07:01:04

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2021-12-19 07:01:04]
  • 评测
  • 测评结果:100
  • 用时:17ms
  • 内存:3676kb
  • [2021-01-22 00:10:51]
  • 提交

answer

#pragma GCC optimize ("O3")
#pragma GCC target ("avx")

#include <cstdio>
#include <cassert>
#include <cmath>
#include <cstring>

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <stack>
#include <queue>

#include <tuple>

#define getchar getchar_unlocked
#define putchar putchar_unlocked

#define _rep(_1, _2, _3, _4, name, ...) name
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, c) for (int i = int(a); i < int(b); i += int(c))
#define rep(...) _rep(__VA_ARGS__, rep4, rep3, rep2, _)(__VA_ARGS__)

using namespace std;

using i64 = long long;
using u8 = unsigned char;
using u32 = unsigned;
using u64 = unsigned long long;
using f80 = long double;

int get_int()
{
    int c, n;

    while ((c = getchar()) < '0');

    n = c - '0';

    while ((c = getchar()) >= '0')
        n = n * 10 + (c - '0');

    return n;
}

const int K = 10;
const int mod = 1e9 + 7;
const i64 lmod = i64(mod) << 32;
const int signs[2] = {1, mod - 1};
int invs[K + 2], binom[K + 2][K + 2], B[K + 1], polys[K + 1][K + 2];

int add(int a, int b)
{
    return (a += b - mod) < 0 ? a + mod : a;
}

i64 add64(i64 a, i64 b)
{
    return (a += b - lmod) < 0 ? a + lmod : a;
}

int mul(int a, int b)
{
    return i64(a) * b % mod;
}

int power_sum(int e, int x)
{
    int ret = 0;

    for (int i = 0; i < e + 2; ++i)
        ret = add(mul(ret, x), polys[e][i]);

    return mul(ret, invs[e + 1]);
}

void init()
{
    invs[0] = invs[1] = 1;

    for (int i = 2; i <= K + 1; ++i)
        invs[i] = mul(invs[mod % i], mod - mod / i);

    for (int i = 0; i <= K + 1; ++i)
    {
        binom[i][0] = 1;

        for (int j = 1; j <= i; ++j)
            binom[i][j] = add(binom[i - 1][j - 1], binom[i - 1][j]);
    }

    B[0] = 1;

    for (int i = 1; i <= K; ++i)
    {
        int s = 0;

        for (int j = 0; j < i; ++j)
            s = add(s, mul(binom[i + 1][j], B[j]));

        B[i] = mul(mul(s, invs[i + 1]), signs[1]);
    }

    for (int i = 0; i <= K; ++i)
    {
        for (int j = 0; j <= i; ++j)
            polys[i][j] = mul(mul(binom[i + 1][j], B[j]), signs[j & 1]);

        polys[i][i + 1] = 0;
    }

    polys[0][1] = 1;
}

int scary_sum(int N, int a, int b, int c, int e1, int e2)
{
    assert(N >= 0);
    assert(a >= 0);
    assert(b >= 0);
    assert(c >= 1);
    assert(e1 + e2 <= K);

    using T = tuple<int, int, int, int>;
    stack<T> stac;

    while (1)
    {
        stac.emplace(N, a, b, c);

        if (N < 0 || a == 0)
            break;

        if (a >= c)
        {
            a %= c;
        }
        else if (b >= c)
        {
            b %= c;
        }
        else
        {
            N = (i64(a) * N + b) / c - 1;
            b = c - 1 - b;
            swap(a, c);
        }
    }

    const int S = e1 + e2;
    static int curr[K + 1][K + 1] = {}, next[K + 1][K + 1] = {};

    while (!stac.empty())
    {
        tie(N, a, b, c) = stac.top();
        stac.pop();

        if (N < 0)
        {
            ;
        }
        else if (a == 0)
        {
            int q = b / c;

            for (int e1 = 0; e1 <= S; ++e1)
            {
                int s = power_sum(e1, N);

                for (int e2 = 0; e2 <= S - e1; ++e2)
                    next[e1][e2] = s, s = mul(s, q);
            }
        }
        else if (a >= c || b >= c)
        {
            int q = (a >= c) ? a / c : b / c;
            int d = (a >= c) ? 1 : 0;

            for (int e1 = 0; e1 <= S; ++e1)
            {
                for (int e2 = 0; e2 <= S - e1; ++e2)
                {
                    i64 s = 0;
                    int p = 1;

                    for (int i2 = 0; i2 <= e2; ++i2)
                    {
                        s = add64(s, i64(p) * mul(binom[e2][i2], curr[e1 + i2 * d][e2 - i2]));
                        p = mul(p, q);
                    }

                    next[e1][e2] = s % mod;
                }
            }
        }
        else
        {
            static int cumu[K + 1][K + 1];

            for (int e2 = 0; e2 <= S - 1; ++e2)
            {
                for (int e1 = 0; e1 <= S - e2 - 1; ++e1)
                {
                    i64 s = 0;

                    for (int j = 0; j <= e1 + 1; ++j)
                    {
                        s = add64(s, i64(polys[e1][e1 + 1 - j]) * curr[e2][j]);
                    }

                    cumu[e1][e2] = mul(s % mod, invs[e1 + 1]);
                }
            }

            const int M = (i64(a) * N + b) / c;

            for (int e1 = 0; e1 <= S; ++e1)
            {
                int p = power_sum(e1, N);

                for (int e2 = 0; e2 <= S - e1; ++e2)
                {
                    i64 t = 0;

                    for (int i2 = 0; i2 < e2; ++i2)
                    {
                        t = add64(t, i64(cumu[e1][i2]) * binom[e2][i2]);
                    }

                    next[e1][e2] = add(p, mod - t % mod);
                    p = mul(p, M);
                }
            }
        }

        swap(curr, next);
    }

    return curr[e1][e2];
}

void solve()
{
    init();
    int T = get_int();
    rep(_, T)
    {
        int N = get_int(), a = get_int(), b = get_int(), c = get_int();
        int e1 = get_int(), e2 = get_int();
        printf("%d\n", scary_sum(N, a, b, c, e1, e2));
    }
}

int main()
{
    clock_t beg = clock();
    solve();
    clock_t end = clock();
    fprintf(stderr, "%.3f sec\n", double(end - beg) / CLOCKS_PER_SEC);
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 2ms
memory: 3540kb

input:

1000
846930887 681692778 714636916 89384 0 1
424238336 719885387 649760493 47794 0 1
189641422 25202363 350490028 16650 0 1
102520060 44897764 967513927 68691 0 1
540383427 304089173 303455737 80541 0 1
521595369 294702568 726956430 5212 0 1
861021531 278722863 233665124 65783 0 1
468703136 101513930 801979803 74068 0 1
635723059 369133070 125898168 34023 0 1
89018457 628175012 656478043 61394 0 1
653377374 859484422 914544920 76230 0 1
756898538 734575199 973594325 13785 0 1
38664371 129566414 ...

output:

787440837
603410377
723035859
327613252
213481743
197744321
183595532
306097937
945612263
462240557
878873337
913033603
276973800
137776104
471637127
36869524
59950373
599468074
662996688
39221965
159523453
603757410
863747292
125209174
321695224
581226543
502962761
546511215
492741651
881346590
834005126
30892292
970172486
534011850
884663238
447858712
669344073
672816965
745462701
723944717
619806513
16101424
226174994
142137015
334071499
704597762
61328763
953156726
492611642
937147687
453460...

result:

ok 1000 numbers

Test #2:

score: 10
Accepted
time: 2ms
memory: 3556kb

input:

1000
846930887 681692778 714636916 89384 0 1
424238336 719885387 649760493 47794 0 1
189641422 25202363 350490028 16650 0 1
102520060 44897764 967513927 68691 0 1
540383427 304089173 303455737 80541 0 1
521595369 294702568 726956430 5212 0 1
861021531 278722863 233665124 65783 0 1
468703136 101513930 801979803 74068 0 1
635723059 369133070 125898168 34023 0 1
89018457 628175012 656478043 61394 0 1
653377374 859484422 914544920 76230 0 1
756898538 734575199 973594325 13785 0 1
38664371 129566414 ...

output:

787440837
603410377
723035859
327613252
213481743
197744321
183595532
306097937
945612263
462240557
878873337
913033603
276973800
137776104
471637127
36869524
59950373
599468074
662996688
39221965
159523453
603757410
863747292
125209174
321695224
581226543
502962761
546511215
492741651
881346590
834005126
30892292
970172486
534011850
884663238
447858712
669344073
672816965
745462701
723944717
619806513
16101424
226174994
142137015
334071499
704597762
61328763
953156726
492611642
937147687
453460...

result:

ok 1000 numbers

Test #3:

score: 10
Accepted
time: 4ms
memory: 3656kb

input:

1000
846930887 681692778 714636916 89384 1 0
649760493 596516650 189641422 85387 0 1
102520060 44897764 967513927 68691 0 0
303455737 35005212 521595369 89173 1 0
861021531 278722863 233665124 65783 1 0
801979803 315634023 635723059 13930 1 0
89018457 628175012 656478043 61394 1 0
914544920 608413785 756898538 84422 0 0
38664371 129566414 184803527 98316 1 0
749241874 137806863 42999171 59957 0 1
84420926 937477085 827336328 2306 0 1
632621730 100661314 433925858 50847 0 1
1100546 998898815 5482...

output:

590247101
607294734
102520061
988535616
258549494
359848706
860104659
914544921
806512744
219134560
36869524
54386320
1100547
760313752
603757410
510232691
82579690
843146721
36876088
935671592
290199337
365292116
534011850
126900199
669344073
690573152
719144156
644864030
602224207
100895714
45206689
434041280
264907171
256823057
67854540
733119495
180252342
820912308
272469788
361410843
37127830
149878627
396473732
434248628
188213260
521443703
606206963
696562451
871976529
967681097
27673816
...

result:

ok 1000 numbers

Test #4:

score: 10
Accepted
time: 4ms
memory: 3612kb

input:

1000
846930887 681692778 714636916 89384 1 0
649760493 596516650 189641422 85387 0 1
102520060 44897764 967513927 68691 0 0
303455737 35005212 521595369 89173 1 0
861021531 278722863 233665124 65783 1 0
801979803 315634023 635723059 13930 1 0
89018457 628175012 656478043 61394 1 0
914544920 608413785 756898538 84422 0 0
38664371 129566414 184803527 98316 1 0
749241874 137806863 42999171 59957 0 1
84420926 937477085 827336328 2306 0 1
632621730 100661314 433925858 50847 0 1
1100546 998898815 5482...

output:

590247101
607294734
102520061
988535616
258549494
359848706
860104659
914544921
806512744
219134560
36869524
54386320
1100547
760313752
603757410
510232691
82579690
843146721
36876088
935671592
290199337
365292116
534011850
126900199
669344073
690573152
719144156
644864030
602224207
100895714
45206689
434041280
264907171
256823057
67854540
733119495
180252342
820912308
272469788
361410843
37127830
149878627
396473732
434248628
188213260
521443703
606206963
696562451
871976529
967681097
27673816
...

result:

ok 1000 numbers

Test #5:

score: 10
Accepted
time: 15ms
memory: 3604kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers

Test #6:

score: 10
Accepted
time: 15ms
memory: 3556kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers

Test #7:

score: 10
Accepted
time: 15ms
memory: 3676kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers

Test #8:

score: 10
Accepted
time: 17ms
memory: 3660kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers

Test #9:

score: 10
Accepted
time: 17ms
memory: 3604kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers

Test #10:

score: 10
Accepted
time: 15ms
memory: 3644kb

input:

1000
846930887 681692778 714636916 89384 3 3
649760493 596516650 189641422 85387 2 3
102520060 44897764 967513927 68691 0 6
303455737 35005212 521595369 89173 7 0
861021531 278722863 233665124 65783 7 1
801979803 315634023 635723059 13930 9 0
89018457 628175012 656478043 61394 9 0
914544920 608413785 756898538 84422 8 0
38664371 129566414 184803527 98316 1 8
749241874 137806863 42999171 59957 6 1
84420926 937477085 827336328 2306 6 1
632621730 100661314 433925858 50847 4 3
1100546 998898815 5482...

output:

269986411
687117872
337796106
649269006
273534477
925890819
789776059
781917067
471414212
683680813
655243026
766680733
110386800
920667633
42177293
33248798
268698025
97602241
455950431
787378605
628127823
884695308
910301084
481441390
301149571
40678494
744524425
997602040
853435603
942399367
437197384
491152627
302759221
595113582
980957231
512095135
821264982
72897687
680504857
919780751
600132259
164276457
84297631
233540234
684833766
59063866
487526620
501600706
330160466
473938797
6686221...

result:

ok 1000 numbers