SDOI2013 隨機數生成器

2022-06-22 23:42:09 字數 1320 閱讀 2492

最近小 w 準備讀一本新書,這本書一共有\(p\)頁,頁碼範圍為\(0 \sim p-1\)。

小 w 很忙,所以每天只能讀一頁書。為了使事情有趣一些,他打算使用 noi2012 上學習的線性同餘法生成乙個序列,來決定每天具體讀哪一頁。

我們用\(x_i\)來表示通過這種方法生成出來的第\(i\)個數,也即小 w 第\(i\)天會讀哪一頁。這個方法需要設定\(3\)個引數\(a,b,x_1\),滿足\(0\leq a,b,x_1\lt p\),且 \(a,b,x_1\)都是整數。按照下面的公式生成出來一系列的整數:

\[x_ \equiv a \times x_i+b \pmod p

\]其中\(mod\)表示取餘操作。

但是這種方法可能導致某兩天讀的頁碼一樣。

小 w 要讀這本書的第\(t\)頁,所以他想知道最早在哪一天能讀到第\(t\)頁,或者指出他永遠不會讀到第\(t\)頁。

設\(m\)天第一次讀到\(t\)頁,就有\(a^mx_1+b\frac\equiv t\pmod\),後面一項是等比數列求和。

化下式子就是:

\[a^m\equiv (t+\frac)\times (x_1+\frac)^\pmod

\]\(p\)又是質數,這就是個\(bsgs\)的板子式子了。注意這裡認為的\(a\)要\(>1\),\(a\leq 1\)的情況討論一下就可以了。複雜度\(\mathcal(t\sqrt\log p)\)

#include#define rg register

#define il inline

#define cn const

#define gc getchar()

#define fp(i,a,b) for(rg int i=(a),ed=(b);i<=ed;++i)

#define fb(i,a,b) for(rg int i=(a),ed=(b);i>=ed;--i)

#define go(u) for(rg int i=head[u];~i;i=e[i].nxt)

#define mp make_pair

#define fi first

#define se second

using namespace std;

typedef cn int cint;

typedef pairpr;

il void rd(int &x)

int main()else if(a == 1)

else

nw = 1ll*nw*pw2%p;

}printf("%d\n", ans);

} }return 0;

}

SDOI2013 隨機數生成器

題意 給定 a,b,p,x 1 forall i 1,x i ax b 求最小的 i 滿足 x i t 若無解則輸出 1。0 leq a,b,x 1 t題解 挺水的一道題,展開之後bsgs即可。但 a leq 1 的地方需要特判,還巨複雜,有高中數學題內味了。複雜度 o sqrt 套路 includ...

隨機數生成器

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