[NOI2012]隨機數生成器 快速冪
阿新 • • 發佈:2018-12-31
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;
}