160802025-03-30 20:05:26szilAutópálya inflációcpp17Wrong answer 15/100252ms6220 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll MOD = 1e9+7;
const int MAXN = 3001;
const int MAXM = 6001;

const int BLOCK_CNT = 55;
const int BLOCK_SIZE = 60;

const ll MULTI = (1ll<<(1+BLOCK_SIZE))%MOD;

struct bigint {

    vector<uint64_t> data;

    bigint() {
        data.assign(BLOCK_CNT, ~0ull);
    }

    void clear() {
        data.assign(BLOCK_CNT, 0ull);
    }

    bool operator<(const bigint &rhs) {
        for (int i = 0; i < BLOCK_CNT; i++) {
            if (data[i] != rhs.data[i]) {
                return data[i] < rhs.data[i];
            }
        }
        return 0;
    }

    bigint operator+(const bigint &rhs) {
        bigint res;
        res.clear();
        bool carry = 0;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            res.data[i] = data[i] + rhs.data[i] + carry;
            carry = (res.data[i] >> (BLOCK_SIZE + 1)) & 1;
            res.data[i] &= ~(1ull << (BLOCK_SIZE + 1));
        }

        return res;
    }

    void inflate() {
        bool carry = 0;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            bool next_carry = (data[i] >> BLOCK_SIZE) & 1;
            data[i] &= ~(1ull << BLOCK_SIZE);
            data[i] <<= 1;
            data[i] |= carry;
            carry = next_carry;
        }
    }

    ll calc_ans() {
        ll ans = 0;
        ll mul = 1;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            data[i] %= MOD;
            ans += data[i] * mul;
            ans %= MOD;
            mul *= MULTI;
            mul %= MOD;
        }
        return ans;
    }
};

int u[MAXM], v[MAXM];
bool vis[MAXN];

void solve() {
    int n, m; cin >> n >> m;
    vector<bigint> w(m+1);
    for (int i = 1; i <= m; i++) {
        w[i].clear();
        cin >> u[i] >> v[i] >> w[i].data.back();
    }
    vector<bigint> dist_last(n+1);
    dist_last[1].clear();
    vis[1] = 1;
    int is_ok = -1;
    for (int i = 1; i <= n; i++) {

        if (is_ok != -1 && is_ok + 40 < i) break;

        bool ok = true;
        for (int j = 1; j <= n; j++) {
            if (!vis[j]) ok = false;
        }
        if (is_ok == -1) is_ok = i;

        vector<bigint> dist_curr = dist_last;
        for (int j = 1; j <= m; j++) {
            if (vis[u[j]] && dist_last[u[j]] + w[j] < dist_curr[v[j]]) {
                dist_curr[v[j]] = dist_last[u[j]] + w[j];
                vis[v[j]] = 1;
            }
        }
        for (int j = 1; j <= m; j++) {
            if (vis[v[j]] && dist_last[v[j]] + w[j] < dist_curr[u[j]]) {
                dist_curr[u[j]] = dist_last[v[j]] + w[j];
                vis[u[j]] = 1;
            }
        }

        dist_last = dist_curr;

        for (int j = 1; j <= m; j++) {
            w[j].inflate();
        }
    }

    for (int i = 2; i <= n; i++) {
        cout << dist_last[i].calc_ans() << "\n";
    }
    cout << "\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1; 
    // cin >> t;
    while (t--) solve();
    return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
2Wrong answer189ms6016 KiB
subtask20/8
3Accepted127ms4612 KiB
4Wrong answer105ms4788 KiB
5Wrong answer76ms4612 KiB
6Accepted123ms4596 KiB
7Wrong answer48ms4612 KiB
subtask315/15
8Accepted1ms316 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
11Accepted1ms316 KiB
12Accepted1ms316 KiB
13Accepted1ms508 KiB
14Accepted1ms508 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask40/34
19Accepted232ms5940 KiB
20Wrong answer156ms6028 KiB
21Wrong answer128ms6056 KiB
22Accepted217ms6020 KiB
23Accepted216ms6028 KiB
24Wrong answer68ms6020 KiB
25Accepted250ms5944 KiB
26Accepted230ms6020 KiB
27Wrong answer208ms6032 KiB
28Wrong answer61ms4608 KiB
29Wrong answer59ms4612 KiB
30Wrong answer37ms4172 KiB
31Wrong answer63ms4596 KiB
32Wrong answer64ms6004 KiB
33Wrong answer64ms6008 KiB
subtask50/21
34Wrong answer13ms1548 KiB
35Accepted59ms1840 KiB
36Accepted61ms1588 KiB
37Accepted63ms1620 KiB
38Accepted63ms1844 KiB
39Accepted64ms1844 KiB
40Wrong answer63ms1844 KiB
41Wrong answer63ms1836 KiB
42Wrong answer13ms1116 KiB
43Wrong answer8ms1076 KiB
44Wrong answer8ms1076 KiB
45Wrong answer8ms1076 KiB
46Wrong answer10ms1076 KiB
47Wrong answer9ms1076 KiB
48Wrong answer18ms1356 KiB
49Wrong answer18ms1348 KiB
subtask60/22
50Wrong answer68ms5988 KiB
51Wrong answer200ms6212 KiB
52Accepted225ms6024 KiB
53Accepted228ms6160 KiB
54Accepted252ms6220 KiB
55Accepted233ms6016 KiB
56Wrong answer203ms6032 KiB
57Wrong answer203ms5940 KiB
58Wrong answer14ms1844 KiB
59Wrong answer61ms4556 KiB
60Wrong answer57ms4616 KiB
61Wrong answer54ms4608 KiB
62Wrong answer41ms4380 KiB
63Wrong answer61ms4588 KiB
64Wrong answer67ms6016 KiB
65Wrong answer71ms6008 KiB
66Wrong answer61ms6024 KiB