題目描述
棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法(linear congruential method)來生成乙個隨機數列,這種方法需要設定四個非負整數引數m,a,c,x[0],按照下面的公式生成出一系列隨機數:
x[n+1]=(ax[n]+c) mod m
用這種方法生成的序列具有隨機序列的性質,因此這種方法被廣泛地使用,包括常用的c++和pascal的產生隨機數的庫函式使用的也是這種方法。
棟棟知道這樣產生的序列具有良好的隨機性,不過心急的他仍然想盡快知道x[n]是多少。由於棟棟需要的隨機數是0,1,…,g-1之間的,他需要將x[n]除以g取餘得到他想要的數,即x[n] mod g,你只需要告訴棟棟他想要的數x[n] mod g是多少就可以了。
輸入輸出格式
輸入格式:
輸入包含6個用空格分割的整數m,a,c,x[0],n和g,其中a,c,x[0]是非負整數,m,n,g是正整數。
輸出格式:
輸出乙個數,即x[n] mod g
輸入輸出樣例
輸入樣例#1:
11 8 7 1 5 3
輸出樣例#1:
2 說明
計算得x[n]=x[5]=8,故(x[n] mod g) = (8 mod 3) = 2
100%的資料中n,m,a,c,x[0]<=10^18,g<=10^8矩陣
乘法,我
們發現由
x[n+
1]=(
ax[n
]+c)
modm
可以將x
[n]表
示為an
x0+c
(an−
1+an
−2+.
..+a
+1)
構造出一
個形如[
a0c1
]的矩陣
。之後將
它自乘n
次,則m
ar[1
][1]
=an,
mar[
1][2
]=後面
的常數部
分。 注
意此題要
開ll,
還要打快
速乘,畢
竟noi
題目還是
有坑點。
#include
#include
#include
#define rep(i,s,t) for(int i=s;i<=t;i++)
using
namespace
std;
typedef
long
long ll;
ll n,m,a,c,x0,g,abcd;
ll quick_mul(ll a,ll b)
return ans;
}namespace martrix_mulans,mimi;
martrix mul(martrix a,martrix b)
martrix power(martrix a,ll n)
return ans;
}}int main()
BZOJ2875 隨機數生成器(矩陣快速冪)
棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法 linear congruential method 來生成乙個隨機數列,這種方法需要設定四個非負整數引數m,a,c,x 0 按照下面的公式生成出一系列隨機數 x n 1 ax n c mo dm其中mod m表示前面...
隨機數生成器
標頭檔案 內容 rand,srand函式和rand max常量 rand max 在windows系統中為32767 在類unix系統中為2147483647 rand 函式返回乙個0 rand max的隨機整數 srand seed 函式 接受unsigned int 型別的引數seed,以see...
MATLAB隨機數生成器
1 rand 生成 0,1 區間上均勻分布的隨機數 基本語法 rand m,n,p 生成排列成m n p 多維向量的隨機數。如果只寫m,則生成m m矩陣 如果引數為 m,n 可以省略方括號。2 randn 生成服從標準正太分布 均值為0,方差為1 的隨機數 基本語法 randn m,n,p,解釋同1...