cogs 963 隨機數生成器

2021-07-04 02:34:19 字數 1674 閱讀 2804

★★   輸入檔案:randoma.in輸出檔案:randoma.out簡單對比

時間限制:1 s   記憶體限制:128 mb

【問題描述】

棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法(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是多少就可以了。

【輸入格式】

輸入檔案randoma.in中包含6個用空格分割的整數m,a,c,x[0],n和g,其中a,c,x[0]是非負整數,m,n,g是正整數。

【輸出格式】

輸出到檔案randoma.out中,輸出乙個數,即x[n] mod g

【樣例輸入】

11 8 7 1 5 3

【樣例輸出】

2【樣例說明】

計算得x[n]=x[5]=8,故(x[n] mod g) = (8 mod 3) = 2

【資料規模】

40%的資料中m為質數

30%的資料中m與a-1互質

50%的資料中n<=10^6

100%的資料中n<=10^18

40%的資料m,a,c,x[0]<=10^4

85%的資料m,a,c,x[0]<=10^9

100%的資料中m,a,c,x[0]<=10^18

100%的資料中g<=10^8

對於所有資料,n>=1,m>=1,a>=0,c>=0,x[0]>=0,g>=1。

不過話說這道題卡了很久呢,,原因是太懶不想打高精度,而且也總是學不會快速和的簡化乘法溢位

實際上是矩陣乘法,注意中間會溢位

對於ull二進位制數,我們可以把它像小學豎式一樣列出來,乘完求和就可以了

inline ull mul(ull a,ull b)return ret;

}

a掉**如下

#include#include#include#includeusing namespace std;

typedef unsigned long long ull;

ull n;

ull n,a,c;

ull mat[2][2],ans[2][2];

int m=2;

ull tmp[2][2][2];

inline ull mul(ull a,ull b)return ret;

}void pow(int type)

mat[0][0]=x;mat[0][1]=1;

mat[1][0]=0;mat[1][1]=0;

pow(0);

printf("%lld",(ans[0][0]%n)%g);

return 0;

}

隨機數生成器

標頭檔案 內容 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...

隨機數生成器,隨機種子

遊戲中經常要用到隨機數,但如果乙個沒有隨機種子的的生成器,就沒法重複之前的隨機數了。js的math.random就用不了隨機種子,只好自己弄了乙個,有了隨機種子,每次只要傳入相同的種子,都會得到同樣的隨機數。直接 function seededrandom seed,min,max 這是一種偽隨機數...