NOI2012 隨機數生成器 矩陣乘法

2021-06-29 03:14:02 字數 1884 閱讀 7433

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

題解:乙個挺裸的矩陣乘。 [a

011]

×[x[n−1

]c] =[x

[n]c

] 然後用快速冪計算第乙個矩陣的n次方最後再乘上 [x

[0]c

] 即可。

使用快速加,可不用高精度。。

#include

#include

using

namespace

std;

long

long ans[10][10],a,m,c,x[10],n,g,aa[10][10],sum;

bool f;

long

long cheng(long

long a,long

long b)

return ans;

}void power(long

long n)

else

}n/=2;

k[1][1]=(cheng(aa[1][1],aa[1][1])+cheng(aa[1][2],aa[2][1]))%m;

k[1][2]=(cheng(aa[1][1],aa[1][2])+cheng(aa[1][2],aa[2][2]))%m;

k[2][1]=(cheng(aa[2][1],aa[1][1])+cheng(aa[2][2],aa[2][1]))%m;

k[2][2]=(cheng(aa[2][1],aa[1][2])+cheng(aa[2][2],aa[2][2]))%m;

aa[1][1]=k[1][1];aa[1][2]=k[1][2];

aa[2][1]=k[2][1];aa[2][2]=k[2][2];

}} int main()

noi2012隨機數生成器

x n 1 ax n c mod m其中mod m表示前面的數除以m的餘數。從這個式子可以看出,這個序列的下乙個數總是由上乙個數生成的。用這種方法生成的序列具有隨機序列的性質,因此這種方法被廣泛地使用,包括常用的c 和pascal的產生隨機數的庫函式使用的也是這種方法。棟棟知道這樣產生的序列具有良好...

NOI2012 隨機數生成器

bzoj2875 第一眼看是矩陣乘法 高精,順便藉此機會學了一下壓八位高精 然後一直wa 拍到最後拍不下去了,索性重打了一遍,不過沒用高精,用的類似快速冪的快速乘,同樣解決了溢位問題 快速乘 矩陣乘法 include include include include typedef long long...

NOI2012 隨機數生成器 矩陣快速冪

棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法 linear congruential method 來生成乙個隨機數列,這種方法需要設定四個非負整數引數 m,a,c,x 0 按照下面的公式生成出一系列隨機數 x ax n c bmod m 其中 mod m 表示前...