160822025-03-30 20:07:24szilAutópálya inflációcpp17Wrong answer 15/1001.506s6212 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 + 60 < i) break;

        bool ok = true;
        for (int j = 1; j <= n; j++) {
            if (!vis[j]) ok = false;
        }
        if (ok && 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
2Accepted331ms6016 KiB
subtask20/8
3Accepted193ms4612 KiB
4Accepted202ms4808 KiB
5Wrong answer231ms4604 KiB
6Accepted175ms4604 KiB
7Wrong answer1.399s4612 KiB
subtask315/15
8Accepted1ms316 KiB
9Accepted1ms500 KiB
10Accepted1ms328 KiB
11Accepted1ms496 KiB
12Accepted1ms316 KiB
13Accepted1ms316 KiB
14Accepted1ms316 KiB
15Accepted1ms316 KiB
16Accepted1ms384 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask40/34
19Accepted335ms5968 KiB
20Wrong answer407ms6024 KiB
21Wrong answer404ms6024 KiB
22Accepted337ms6032 KiB
23Accepted351ms6028 KiB
24Wrong answer481ms6188 KiB
25Accepted358ms6036 KiB
26Accepted365ms6024 KiB
27Wrong answer259ms6032 KiB
28Wrong answer469ms4612 KiB
29Wrong answer578ms4608 KiB
30Wrong answer1.213s4336 KiB
31Wrong answer501ms4848 KiB
32Wrong answer851ms6164 KiB
33Wrong answer813ms6008 KiB
subtask50/21
34Wrong answer56ms1376 KiB
35Accepted82ms1844 KiB
36Accepted81ms1840 KiB
37Accepted82ms1844 KiB
38Accepted81ms1840 KiB
39Accepted81ms1844 KiB
40Wrong answer79ms2036 KiB
41Wrong answer79ms2040 KiB
42Accepted32ms1140 KiB
43Wrong answer50ms1272 KiB
44Wrong answer52ms1132 KiB
45Wrong answer52ms1076 KiB
46Wrong answer37ms1132 KiB
47Wrong answer35ms1272 KiB
48Accepted52ms1352 KiB
49Accepted52ms1360 KiB
subtask60/22
50Wrong answer479ms6028 KiB
51Accepted358ms6028 KiB
52Accepted363ms6024 KiB
53Accepted358ms5852 KiB
54Accepted345ms6024 KiB
55Accepted324ms6212 KiB
56Wrong answer261ms5940 KiB
57Wrong answer259ms5940 KiB
58Wrong answer172ms1832 KiB
59Wrong answer510ms4608 KiB
60Wrong answer560ms4608 KiB
61Wrong answer700ms4616 KiB
62Wrong answer815ms4408 KiB
63Wrong answer467ms4588 KiB
64Wrong answer833ms6008 KiB
65Wrong answer833ms6008 KiB
66Wrong answer1.506s6024 KiB