原题链接
过程详解
kruskal
using namespace std;
typedef long long ll;
const int N = 3e7 + 10;
const int M = 5010;
struct Node{
    int x, y;  // x, y坐标
    ll v; // 权值
    bool operator < (const Node & u) const { return v < u.v; }
};
Node A[N];
int par[2 * M];
int n, m, a, b, c, d, p;
void init(){
    A[0].v = a;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; ++j) {
            int id = m * (i - 1) + j;  // 二维映射到一位数组中
            A[id] = {i, j, ((ll)A[id - 1].v * A[id - 1].v * b + (ll)A[id - 1].v * c + d) % p};
        }
    }
}
// 并查集
int find(int x){
    if(x == par[x]) return x;
    return par[x] = find(par[x]);
}
void kruskal(){
    // 至少(n - 1) + (m - 1) + 1个点才能将所有行,所有列连接在一起
    // 此时剩下的点为free
    ll res = 0, cnt = n + m - 1;
    // 1~n 表示行,n+1~n+m 表示列
    for (int i = 1; i <= n + m; ++i) {
        par[i] = i;
    }
    // 按各点的权值排序
    sort(A + 1, A + 1 + m * n);
    for (int i = 1; i <= m * n; ++i) {
        int x = A[i].x;
        int y = A[i].y;
        int v = A[i].v;
        x = find(x);
        y = find(n + y);
        if(!cnt) break;
        if(x!=y){
            par[x] = y;
            res += v;
            cnt--;
        }
    }
    cout << res << endl;
}
int main(){
    cin >> n >> m >> a >> b >> c >> d >> p;
    init();
    kruskal();
    return 0;
}prim
using namespace std;
typedef long long ll;
const int N = 5000 + 10, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, a, b, c, d, p;
int dis[N * 2], g[N][N];
bool vis[N * 2];
int prim() {
    int res = 0;
    memset(dis, 0x3f, sizeof dis);
    dis[1] = 0;
    for (int i = 1; i <= n + m; i++) {
        int val = INF, u = 0;
        for (int i = 1; i <= n + m; i++) {
            if (vis[i]) continue;
            if (dis[i] < val) {
                val = dis[i];
                u = i;
            }
        }
        res += val;
        vis[u] = 1;
        if (u <= n) {
            for (int j = 1; j <= m; j++) {
                int v = j + n;
                dis[v] = min(dis[v], g[u][j]);
            }
        } else {
            for (int i = 1; i <= n; i++) {
                int v = i;
                dis[v] = min(dis[v], g[i][u - n]);
            }
        }
    }
    return res;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m >> a >> b >> c >> d >> p;
    ll res = a;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            res = (res * res * b % p + res * c + d) % p;
            g[i][j] = res;
        }
    cout << prim();
    return 0;
}                
                










