bzoj 2875 [Noi2012]随机数生成器 矩阵乘法

题面

题目传送门

解法

矩阵乘法sb题

注意整数乘法要使用龟速乘,否则会爆long long

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct Matrix {
    int a[4][4];
    void Clear() {memset(a, 0, sizeof(a));}
};
int n, m, a, c, x, g;
int mul(int x, int y) {
    int ret = 0;
    while (y) {
        if (y & 1) ret = (ret + x) % m;
        y >>= 1, x = (x + x) % m;
    }
    return ret;
}
Matrix operator * (Matrix x, Matrix y) {
    Matrix ret; ret.Clear();
    for (int k = 1; k <= 2; k++)
        for (int i = 1; i <= 2; i++)
            for (int j = 1; j <= 2; j++)
                ret.a[i][j] = (ret.a[i][j] + mul(x.a[i][k], y.a[k][j])) % m;
    return ret;
}
Matrix operator ^ (Matrix x, int y) {
    Matrix ret = x; y--;
    while (y) {
        if (y & 1) ret = ret * x;
        y >>= 1, x = x * x;
    }
    return ret;
}
main() {
    cin >> m >> a >> c >> x >> n >> g;
    Matrix tx, ret; tx.Clear();
    tx.a[1][1] = a, tx.a[1][2] = c;
    tx.a[2][1] = 0, tx.a[2][2] = 1;
    ret.a[1][1] = x, ret.a[2][1] = 1;
    tx = tx ^ n; ret = tx * ret;
    cout << ret.a[1][1] % g << "\n";
    return 0;
}

原文地址:https://www.cnblogs.com/copperoxide/p/9476730.html

时间: 2024-10-11 15:05:36

bzoj 2875 [Noi2012]随机数生成器 矩阵乘法的相关文章

BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

矩阵快速幂...+快速乘就OK了 -------------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long long ll; ll MOD, a, c, x, n, g; ll MUL(ll a, ll b) { ll ans = 0; for(; b; b >>= 1

[bzoj 2875][noi2012]随机数生成器

传送门 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me thod)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机 数X[n]X[n+1]=(aX[n]+c)mod m其中mod m表示前面的数除以m的余数.从这个式子可以看出,这个序列的下一个数 总是由上一个数生成的.用这种方法生成的序列具有随机序列的性质,因此这种方法被广泛地使用,包括常用

2875: [Noi2012]随机数生成器 - BZOJ

DescriptionInput 包含6个用空格分割的m,a,c,X0,n和g,其中a,c,X0是非负整数,m,n,g是正整数. Output 输出一个数,即Xn mod gSample Input 11 8 7 1 5 3 Sample Output2 快速幂+快速乘 1 type 2 matrix=array[1..2,1..2]of int64; 3 var 4 a,c,p,x0,n,g:int64; 5 x,y:matrix; 6 7 function kc(x,y:int64):int

luogu_P2044【题解】 随机数生成器 矩阵乘法

题面:https://www.luogu.org/problem/P2044 矩阵乘法裸题. 关键在于base和ans矩阵. 经过计算待定系数可以得到. ans = {  (x0,1)  ,  (0,0)  } base = {  (a,0)  ,  (c,1)  } 如代码所示. 然后就可以快乐的矩阵乘法了! 但是还有一个事. 大数据不要忘了龟速乘! 不然会爆炸成50分. 代码如下: #include<bits/stdc++.h> #define ll long long using nam

【BZOJ】2875: [Noi2012]随机数生成器(矩阵乘法+快速乘)

http://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵的话很容易看出来.....我就不写了.太水了. 然后乘法longlong会溢出...那么我们用快速乘...就是将快速幂的乘法变成加法...这种很简单吧.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream>

矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器

963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数{Xn}:X[n+1]=(aX[n]+c) mod m 其中mo

使用JAVA生成随机数实现矩阵乘法

矩阵乘法的定义: 在计算机中,一个矩阵实际上就是一个二维数组.一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和.比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵. 其中,结果矩阵的那个4(结果矩阵中第二(i)行第二(j)列)=2(第一个矩阵第二(i)行第一列)*2(第二个矩阵中第一行第二(j)列)+0(第一个矩阵第二(

[NOI2012] 随机数生成器

963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数m,a,c,X[0],按照下面的公式生成出一系列随机数&{X_n}&: Xn+1=(aXn+c)mod m 其中m

bzoj2875: [Noi2012]随机数生成器

矩阵乘法. x[n] = {x[0],1} * ( {a,0} ^ n ) {b,1} 写成这样谁能看懂.... noi里的大水题.我居然 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define LL long long using namespace std; const int maxn = 2; LL a,b,mod,g,x,n,ans; LL