1. 程式人生 > 實用技巧 >UVA 11754 Code Feat

UVA 11754 Code Feat

https://vjudge.net/problem/UVA-11754

題目

需要算密碼$Q$,滿足$C$個條件,每個條件為$Q \mod X[i] \in \{ Y[i]_1, Y[i]_2, \cdots, Y[i]_k\}$,問最小的S個密碼是哪些。

保證X兩兩互素,所有X的積小於$2^{32}$,$1\leqslant C\leqslant 9$,$1\leqslant k\leqslant 100$,$X\geqslant 2$

#Sample Input
3 2
2 1 1
5 2 0 3
3 2 1 2
0 0
#Sample Output
5
13

題解

想不出快速的做法……

如果暴力列舉一組孫子定理的餘數,顯然超時

如果暴力列舉符合一個條件的所有數字然後判斷,有可能超時

為了不超時,假設最大的密碼是$Q_M\leqslant 2^{32}\times 11$

那麼,列舉的數字是$X[i]\times t+Y[i]_j$

也就是每$X[i]$個數字需要列舉$k$次

大概列舉$Q_M / X[i] \times k$次,感覺特別不靠譜

如果每個條件的餘數夠多,那麼可以少列舉一些數字

就有這樣的暴力:

當餘數比較少的時候,直接暴力列舉一組孫子定理的餘數,然後用孫子定理,不會超時

當餘數比較多的時候,暴力列舉數字,為了儘量少列舉,選擇$k/X[i]$小的一個條件,在餘數很多的情況下可以少列舉一些不符合條件的數字

//看了一眼書上的題解,看到了孫子定理,以為是什麼神奇的變形,怎麼也想不出來,難受地看了很久的數論書