为什么我RE了呢? Luogu3390 矩阵快速幂

#include<iostream>
#include<cstring>
#include<cstdio>
#define MOD 1000000007
#define LL long long
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;

class Matrix {
public:
    Matrix(int n):size(n) {
        data = new LL[size * size];
        rep(i, 0, size)rep(j, 0, size) data[i * size + j] = 0;
    }
    ~Matrix() { delete[] data; }
    Matrix(Matrix& mat) {
        size = mat.size;
        data = new LL[size * size];
        rep(i, 0, size)rep(j, 0, size)data[i * size + j] = mat.data[i * size + j];
    }
    Matrix& operator =(const Matrix& mat) {
        if (this == &mat)return *this;
        delete[] data;
        size = mat.size;
        data = new LL[size * size];
        rep(i, 0, size)rep(j, 0, size)data[i * size + j] = mat.data[i * size + j];
        return *this;
    }
    void in() {
        rep(i, 0, size)rep(j, 0, size)cin >> data[i * size + j];
    }
    void out() {
        rep(i, 0, size) {
            rep(j, 0, size) printf("%lld ", data[i*size+j]);
            printf("\n");
        }
    }
    friend Matrix operator*(const Matrix& mat1, const Matrix& mat2) {
        int s = mat1.size;
        Matrix tmp(s);
        rep(i, 0, s)rep(k, 0, s)rep(j, 0, s) {
            tmp.data[i * s + j] = (tmp.data[i * s + j] + mat1.data[i * s + k] * mat2.data[k * s + j]%MOD)%MOD;
        }
        return tmp;
    }
    friend Matrix operator^( Matrix mat, int power) {
        int s = mat.size;
        Matrix I(s);
        rep(i, 0, s)I.data[i * s + i]=1;
        while (power) {
            if (power & 1) I = I * mat;
            mat=mat*mat;
            power = power >> 1LL;
        }
        return I;
    }
private:
    int size;
    LL* data;
};

int main() {
    int n;
    LL k;
    cin >> n >> k;
    Matrix A(n);
    A.in();
    (A ^ k).out();
}
小数据没问题,但是数组大了,就会 RE 看似无限循环(?), 代码舍不得扔掉,先记在这儿.挖坑待填.

 

posted @ 2021-01-21 22:46  _dwt  阅读(95)  评论(0)    收藏  举报