bzoj2875 Noi2012 隨機數生成器

2022-03-30 21:42:58 字數 1089 閱讀 2065

矩陣快速冪+快速乘即可。總調不出來,然後發現輸出時a寫成b了sadsadsad。

#include#include#include#includeusing namespace std;

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define clr(x,c) memset(x,c,sizeof(x))

#define ll long long

ll read()

ll mod,a,c,xx,n,g;

ll qmul(ll x,ll y)

return ans;

}struct matrix

matrix operator*(const matrix&o)const

}b,a;

int main()

printf("%lld\n",((qmul(xx,a.a[1][1])+a.a[2][1])%mod)%g);

return 0;

}

棟棟最近迷上了隨機演算法,而隨機數生成是隨機演算法的基礎。棟棟準備使用線性同餘法(linear congruential method)來生成乙個隨機數列,這種方法需要設定四個非負整數引數m, a, c, x0,按照下面的公式生成出一系列隨機數: 

xn+1  =  (axn  +  c) mod m 

mod m 表示前面的數除以m的餘數。從這個式子可以看出,這個序列的下乙個數總是由上乙個數生成的。 

用種方法生成的序列具有隨機序列的性質,因此這種方法被廣泛地使用,包括常用的c++和pascal 的產生隨機數的庫函式使用的也是這種方法。 

知道這樣產生的序列具有良好的隨機性,不過心急的他仍然想盡快知道xn 是多少。由於棟棟需要的隨機數是0, 1,…, g − 1 之間的,他需要將xn除以g。取餘得到他想要的數,即xn mod g,你只需要告訴棟棟他想要的數xn mod g 是多少就可以了。

包含6個用空格分割的m,a,c,x0,n和g,其中a,c,x0是非負整數,m,n,g是正整數。

輸出乙個數,即xn mod g

11 8 7 1 5 3

21<=n,m,a,c,x0<=10^18,1<=g<=10^8

bzoj2875 Noi2012 隨機數生成器

time limit 10 sec memory limit 512 mb submit 1007 solved 577 submit status discuss 包含6個用空格分割的m,a,c,x0,n和g,其中a,c,x0是非負整數,m,n,g是正整數。輸出乙個數,即xn mod g 11 8...

bzoj2875 Noi2012 隨機數生成器

題目鏈結 求 矩乘板子,這裡主要講下會爆long long的整數相乘取模,我們用double可以做到 求 求出 rfloor 我們用long double搞。那麼最後的答案就是 我們直接long long搞,可以視作是在模 的意義下運算。什麼鬼嘛。可以long long搞的原因應該是這樣的。與 不同...

bzoj2876 Noi2012 騎行川藏

蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風景,但在這一路上也有著很多的艱難險阻,路況變化多端,而蛋蛋的體力十分有限,因此在每天的騎行前設定好目的地 同時合理分配好自己的體力是一件非常重要的事情。由於蛋蛋裝備了一輛非常好的自行車,因此在騎行過程...