[NOI2012]随机数生成器【矩阵快速幂】
NOI2012 随机数生成器
题目描述
栋栋最近迷上了随机算法,而随机数是生成随机算法的基础。栋栋准备使用线性同余法(Linear Congruential Method)来生成一个随机数列,这种方法需要设置四个非负整数参数 \(m,a,c,X_0\),按照下面的公式生成出一系列随机数 \(\{X_n\}\):
\]
其中\(mod\ m\) 表示前面的数除以 \(m\) 的余数。从这个式子可以看出,这个序列的下一个数总是由上一个数生成的。
栋栋知道这样产生的序列具有良好的随机性,不过心急的他仍然想尽快知道 \(X_n\) 是多少。由于栋栋需要的随机数是 \(0,1,\dots,g-1\) 之间的,他需要将 \(X_n\) 除以 \(g\) 取余得到他想要的数,即 \(X_n \bmod g\),你只需要告诉栋栋他想要的数 \(X_n \bmod g\) 是多少就可以了。
输入格式
一行 \(6\) 个用空格分割的整数 \(m,a,c,X_0,n\) 和 \(g\),其中 \(a,c,X_0\) 是非负整数,\(m,n,g\) 是正整数。
输出格式
输出一个数,即 \(X_n \bmod g\)。
输入输出样例
输入
11 8 7 1 5 3
输出
2
说明/提示
计算得 \(X_n=X_5=8\),故\((X_n \bmod g) = (8 \bmod 3) = 2\)。
对于 \(100\%\) 的数据,\(n,m,a,c,X_0\leq 10^{18}\),\(1\leq g\leq 10^8\),\(n,m\geq 1\),\(a,c,X_0\geq 0\)。
题意
给出了一个迷惑式子,让你算出来式子的第\(n\)项,然后\(mod\ g\)的结果
分析
看到这样一个个的递推式子,一个个用\(for\)循环来推肯定不行,所以很容易就会想到要用到矩阵快速幂来求。那么我们现在的主要任务就是构造矩阵来进行乘法运算。
首先看到题目中给出的式子:
\]
取模运算可以暂且先不看,因为对结果没什么影响,在矩阵乘法的时候进行取模就行了。所以转化成如下式子:
\]
那么我们就可以根据这个式子来构造矩阵。由矩阵的乘法运算为结果矩阵的\(i\)行\(j\)列为前边矩阵一个的第\(i\)行乘以另一个的第\(j\)列,所以我们可以得出如下的矩阵递推式子:
\begin{matrix}
X_{n-1}\\
c
\end{matrix}
\right]\times \left[
\begin{matrix}
a & 1\\
0 & 1
\end{matrix}
\right] = \left[
\begin{matrix}
X_{n}\\
c
\end{matrix}
\right]
\]
这里用\(X_{n-1}\)这一列分别乘以右边矩阵的第一第二行,得到结果的矩阵,那么我们就可以根据这个递推式子来进行矩阵快速幂。
这里乘法的运算过程如下:
\]
\]
由此得到结果矩阵
这里的矩阵做乘法的时候需要用到龟速乘,不然会爆\(long\ long\)
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct Node{//矩阵结构体
int a[5][5];
};
int m,a,c,x0,g,n;
int ksj(int a,int b){//龟速乘
int ans = 0;
while(b){
if(b & 1)ans = (ans + a) % m;
a = (a + a) % m;
b >>= 1;
}
return ans;
}
Node Mul(Node a,Node b,int c){//矩阵乘法,记得取模
Node ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=1;i<=2;++i){
for(int j=1;j<=2;++j){
for(int k=1;k<=2;++k){
ans.a[i][j] = (ans.a[i][j] + ksj(a.a[i][k],b.a[k][j])%c)%c;
}
}
}
return ans;
}
Node ans;
void qpow(Node &ans,Node b,int c){//矩阵快速幂
while(c){
if(c & 1)ans = Mul(b,ans,m);
b = Mul(b,b,m);
c >>= 1;
}
}
signed main(){
Node bas;
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
ans.a[1][1] = x0;//初始化矩阵
ans.a[2][1] = c;
bas.a[1][1] = a;
bas.a[1][2] = 1;
bas.a[2][1] = 0;
bas.a[2][2] = 1;
qpow(ans,bas,n);
printf("%lld\n",ans.a[1][1] % g);//得答案
}
[NOI2012]随机数生成器【矩阵快速幂】的更多相关文章
- BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )
矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...
- [luogu2044][NOI2012] 随机数生成器 [矩阵快速幂]
题面: 传送门 思路: 看一眼这个公式: $x\left[n+1\right]=\left(a\ast x\left[n\right]+c\right) mod m$ 递推,数据范围$n\leq 10 ...
- [日常摸鱼]bzoj2875[NOI2012]随机数生成器-矩阵快速幂
好裸的矩阵快速幂-然而我一开始居然构造不出矩阵- 平常两个的情况都是拿相邻两项放在矩阵里拿去递推的-然后我就一直构造不出来-其实把矩阵下面弄成1就好了啊orz #include<cstdio&g ...
- bzoj2875随机数生成器——矩阵快速幂
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2875 矩阵快速幂,把x和c分开求,最后加上即可: 为防止爆long long,要用快速乘. ...
- Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)
2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...
- [NOI2012]随机数生成器 矩阵乘法
Code: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring& ...
- 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 栋 ...
- 【BZOJ2875】【NOI2012】随机数生成器(矩阵快速幂)
[BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
随机推荐
- python学习笔记之装饰器、生成器、内置函数、json(五)
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...
- js数组算法题01
题目:随机生成一个长度为 10 的整数类型的数组,例如 [2, 10, 3, 4, 5, 11, 10, 11, 20],将其排列成一个新数组,要求新数组形式如下,例如 [[2, 3, 4, 5], ...
- python-----内存管理机制
一.深浅拷贝的区别 深浅拷贝一般是在列表嵌套列表的情况下去讨论 浅拷贝:只拷贝列表中对象的引用,嵌套列表中的数据是不会进行全部拷贝的 深拷贝:会把对象里面所有的数据都拷贝一份,不再只拷贝对象的引用,会 ...
- scala 数据结构(二):数组
1 数组-定长数组(声明泛型) 第一种方式定义数组 这里的数组等同于Java中的数组,中括号的类型就是数组的类型 val arr1 = new Array[Int](10) //赋值,集合元素采用小括 ...
- java 数据结构(十):Collection子接口:Set接口
1. 存储的数据特点:无序的.不可重复的元素具体的: 以HashSet为例说明:1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的.2. 不可重复性 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
- Python之爬虫(二十一) Scrapy爬取所有知乎用户信息(下)
在上一篇文章中主要写了关于爬虫过程的分析,下面是代码的实现,完整代码在:https://github.com/pythonsite/spider items中的代码主要是我们要爬取的字段的定义 cla ...
- 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版
截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...
- QTimer
目录 简述 详细说明 精度 替代QTimer 成员函数 信号 示例 简述 QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个 ...
- Python Ethical Hacking - KEYLOGGER(1)
A program that records keys pressed on the keyboard. Common features: Store logs locally(local keylo ...