最近小 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...