本題需要使用給定的亂數產生器,請以以下的格式送出解答。
#include <iostream>
using namespace std;
unsigned LFSR() {
static unsigned short lfsr = 44257;
unsigned bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
return lfsr = (lfsr >> 1) | (bit << 15);
}
int main () {
// your code
}
呼叫 LFSR()
會回傳一個題目需要的亂數。
ex: int num = LFSR();
在現實世界中,有很多是透過電腦生成的亂數來做事情的,最常見的例如虛擬賭場。到這裡如果你足夠聰明,你就會發現一件事情:只要你能夠知道它的亂數生成方式,以及它現在生成出哪些數字,你就可以完美預測之後的數字。因此這題的題目是:我們已經知道某個亂數生成器是利用我們上面所寫的函式 LFSR() 來產生出 0 到 n(包括 0 和 n),且不能被 k 整除(包括 0)的亂數。
知道這件事情的你,能夠預測這個亂數生成器產生出來的前五個亂數為何嗎?如果題目輸入 $n = 4, k = 3$,那麼我們依序呼叫 LFSR()
所產生出來的序列會長的像下面這樣子:
如果我們把所有數字都對 $(n+1)$ 取餘數,得到的生成序列會長的像下面這樣子:
我們在挑出符合條件的,也就是不能夠被 $k$ 整除的:
因此,答案輸出為 2 1 4 2 1
,每個數字後接需附加換行。
輸入只有一行,裡面有兩個數字 $n, k$,代表題目所說的 $n, k$。
輸出題目所說的偽亂數生成器產生出來的前五個數字,一行一個。
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0 | 範例測資 | 0 |
2 | 0~8 | 無額外限制 | 100 |