我覺得這個題還是很牛的!
考慮它給我 \(2N-1\) 個點有什麼用,首先如果一個數出現 \(\geq N\) 次就顯然這種數取 \(n\) 個就好了,否則總可以兩兩配對使得配對的兩個數不同,最後剩一個數。
可以說明,剩下的一個數必須選,其餘的一組中選擇恰好一個,能在模意義下表示出 \(0\)。這不強於任意 \(N-1\) 個非 \(0\) 數能表示出所有數。而後面的證明可以考慮當前已經能表示出的數的集合 \(S\),若 \(S=S+x\),因為 \(n\) 是質數,所以說明 \(S\) 是全集,否則每增加一個 \(x\) 至少將 \(S\) 集合擴大一個。初始 \(S=\{0\}\),經過 \(N-1\) 次操作後一定是全集。
現在我們已經可以會一個 \(O(\frac{N^2}{\omega})\) 的做法了:列舉每個數 \(w\),找到一個位置 \(x\) 使得 \(x\) 在集合裡但是 \((x+w)%N\) 不在,用 bitset 最佳化這個過程。
接下來有兩個做法,一個是將所有 \(w\) 相同的放在一起考慮並 random_shuffle,如果將每次模座標變換之後可以被表示出的數看成均勻隨機的話,複雜度就是 \(O(n\log n)\) 的,但是我也不知道怎麼證明它是均勻隨機的。
另一個做法是,等下這個做法好像假了。
但是我們還有第三個做法!假設當前要加入的數是 \(x\),隨便找一個位置 \(v\) 滿足還不能被表示,則在 \(0\to x\to 2x\bmod n\to 3x\bmod n\to\dots\to v\) 這條鏈上二分,就能找到一個前面是 \(0\) 後面是 \(1\) 的位置了。這個做法是確定性的 \(O(n\log n)\),但是比隨機化常數略大。
隨機化 submission
確定性 submission