1. 程式人生 > >[NOI2012]隨機數生成器 快速冪

[NOI2012]隨機數生成器 快速冪

Description
生成一個隨機數列,這種方法需要設定四個非負整數引數m,a,c,X[0],按照下面的公式生成出一系列隨機數X[n]
X[i+1]=(aX[i]+c)mod m
給出N,輸出X[n] mod g。

Sample Input
11 8 7 1 5 3

Sample Output
2

水題,沒什麼好說的。。。

#include <cstdio>
#include <cstring>

using namespace std;
typedef long long LL;
LL multi(LL a, LL b, LL mod) {
    LL ans = 0
; a %= mod; b %= mod; while(b) { if(b & 1) (ans += a) %= mod; (a *= 2) %= mod; b /= 2; } return ans; } LL mod; struct node { LL a[2][2]; node() {memset(a, 0, sizeof(a));} friend node operator *(node a, node b) { node c; for(int i = 0; i < 2; i++) { for
(int j = 0; j < 2; j++) { for(int k = 0; k < 2; k++) { (c.a[i][j] += multi(a.a[i][k], b.a[k][j], mod)) %= mod; } } } return c; } } ans, a; int main() { LL A, C, X0, n, B; scanf("%lld%lld%lld%lld%lld%lld", &mod, &A, &C, &X0, &n, &B); ans.a[0
][0] = X0, ans.a[0][1] = 1; ans.a[1][0] = 0, ans.a[1][1] = 0; a.a[0][0] = A; a.a[0][1] = 0; a.a[1][0] = C; a.a[1][1] = 1; while(n) { if(n & 1) ans = ans * a; a = a * a; n /= 2; } printf("%lld\n", ans.a[0][0] % B); return 0; }