[NOI2012]随机数生成器 快速幂

版权声明:xgc原创文章,未经允许不得转载。 https://blog.csdn.net/xgc_woker/article/details/82292032

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;
}

猜你喜欢

转载自blog.csdn.net/xgc_woker/article/details/82292032