您的位置:首页 > 其它

快速矩阵幂 csu1597 薛XX后代的IQ

2015-07-23 10:56 627 查看
裸快速矩阵的题,,主要来模板测试

说下这个模板用法,下标都是从0开始

Mat(行数,列数,填充矩阵(可填))

mat_mul(A,B)矩阵乘法

mat_pow(A,b)快速矩阵幂

this->S存放矩阵的数组

#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<functional>
#include<algorithm>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int matMX = 3;
const int MX = 200000 + 5;
const int INF = 0x3f3f3f3f;

LL mod;
LL power(LL a, LL b) {
LL ret = 1;
while(b) {
if(b & 1) ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret;
}

struct Mat {
int m, n;
LL S[matMX][matMX];
Mat(int a, int b) {
m = a;
n = b;
memset(S, 0, sizeof(S));
}
Mat(int a, int b, LL w[][matMX]) {
m = a;
n = b;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
S[i][j] = w[i][j];
}
}
}
};

Mat mat_mul(Mat A, Mat B) {
Mat C(A.m, B.n);
for(int i = 0; i < A.m; i++) {
for(int j = 0; j < B.n; j++) {
for(int k = 0; k < A.n; k++) {
C.S[i][j] = (C.S[i][j] + A.S[i][k] * B.S[k][j]) % mod;
}
}
}
return C;
}

Mat Blank(int m, int n) {
Mat ret(m, n);
for(int i = 0; i < m; i++) {
ret.S[i][i] = 1;
}
return ret;
}

Mat mat_pow(Mat A, LL b) {
Mat ret = Blank(A.m, A.n);
while(b) {
if(b & 1) ret = mat_mul(ret, A);
A = mat_mul(A, A);
b >>= 1;
}
return ret;
}

int main() {
int T;
scanf("%d", &T);
while(T--) {
int X, Y, A, B, N;
scanf("%d%d%d%d%lld%d", &X, &Y, &A, &B, &mod, &N);
LL T1[][matMX] = {{0, 1}, {A, B}};
LL T2[][matMX] = {{X}, {Y}};

Mat s(2, 2, T1);
Mat ans(2, 1, T2);

Mat res = mat_mul(mat_pow(s, N), ans);
printf("%lld\n", res.S[1][0]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: