您的位置:首页 > 其它

【BZOJ2875】[Noi2012]随机数生成器【矩阵快速幂】

2016-05-13 18:06 621 查看
【题目链接】

1A。

/* Telekinetic Forest Guard */
#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long LL;

struct _mat {
LL num[2][2];
} trans, E;

inline LL mul(LL a, LL b, LL p) {
return (a * b - (LL)(a / (long double) p * b + 1e-5) * p + p) % p;
}

inline _mat matmul(_mat A, _mat B, LL p) {
_mat C;
for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) {
C.num[i][j] = 0;
for(int k = 0; k < 2; k++) (C.num[i][j] += mul(A.num[i][k], B.num[k][j], p)) %= p;
}
return C;
}

inline _mat qpow(_mat X, LL n, LL p) {
_mat s = E;
for(_mat t = X; n; n >>= 1, t = matmul(t, t, p)) if(n & 1) s = matmul(s, t, p);
return s;
}

int main() {
LL m, a, c, x, n, g;
scanf("%lld%lld%lld%lld%lld%lld", &m, &a, &c, &x, &n, &g);

E.num[0][0] = E.num[1][1] = 1;
trans.num[0][0] = a; trans.num[0][1] = 0;
trans.num[1][0] = c; trans.num[1][1] = 1;

trans = qpow(trans, n, m);
x = (mul(x, trans.num[0][0], m) + trans.num[1][0]) % m;
printf("%lld\n", x % g);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: