problem
交互题,评测机有一个排列 \(p:[int]\),值域是 \([0,n)\),现在可以询问 \(2n\) 次 \((x,y)\),评测机回答 \(\gcd(p_x,p_y)\),你需要回答 \(p\) 中 \(0\) 的两个可能的位置。
\(\gcd(x,0)=x\),\(1\leq n\leq 10^4\)。
solution with \(4n\) queries
考虑固定死一个数,就 \(p_1\) 吧,询问它和其它所有数的 \(\gcd\)。将这些 \(\gcd\) 的 \(\operatorname{lcm}\) 拎出来,就是 \(p_1\)。
然后将所有 \(\gcd(p_1,p_i)=p_1\) 的数拎出来(包括 \(0\)),全部除以 \(p_1\),开始递归。
复杂度分析:如果 \(p_1>1\) 那我们很开心得到一个询问 \(2n\) 次的算法(每次至少折半),但是如果 \(p_1=1\)…………
\[\huge{\text{寄}}
\]
而且这样子,我们甚至可以唯一确定 \(0\) 的位置,不太好。
solution with \(2n\) queries
随机三个数 \(i,j,k\),询问 \(x=\gcd(p_i,p_j),y=\gcd(p_i,p_k)\),如果
- \(x=y\),那么 \(p_i\neq 0\)。
- \(x>y\),那么 \(p_k\neq 0\)(考虑当 \(p_k=0\) 时,\(\gcd(p_i,p_j)>p_i\),这也太离谱了,一个数的约数不能大于他)。
- \(x<y\),那么 \(p_j\neq 0\)。
每次用两次询问排除一个数,询问次数自然是 \(2n\)。