1. 程式人生 > 其它 >gym104090 The 2022 ICPC Asia Hangzhou Regional Programming Contest I. Guess Cycle Length

gym104090 The 2022 ICPC Asia Hangzhou Regional Programming Contest I. Guess Cycle Length

題目大意

互動題

給出一個長度為n的排列p,初始有一個人在某個位置(未知)

每次詢問可以給出一個步數x,然後人會向前走x步並返回所在位置的數字

在1e4次詢問內找到n,n<=1e9

保證排列在互動前固定

題解

顯然,要想知道n就必須要重複走到某個點,否則不同的點之間的關係是未知的

一個簡單的想法是,先走k步走出一個長度為k的段,然後k步k步地跳,這樣一圈下來一定會走到一開始的段

k取sqrt(n)得2sqrt(n)次,寄?


然後發現很重要的一點是,返回的是數字p[i]

也就是說,如果隨機把人丟到一個位置,那麼p的期望是n/2

同理,如果隨機丟k次,則p的期望是nk/(k+1),和n的誤差僅有n/(k+1)

這樣就可以搞事了(注意次數≠步數
①先隨機丟k次random步,那麼可以得到t≈nk/(k+1),可以等價於向後走n/(k+1)步
②然後走k次1步,走出一個長為k的段A
③之後走1次t步,那麼會走到段A末尾再向前n/(k+1)步的位置
④最後k步k步跳,大概跳n/k^2次就可以走到段A裡面,剛好走完一圈

算一下次數,①k+②k+③1+④n/k^2,當k取1000時就只用3000次,所以k取3000就差不多了
(③④一定可以保證正確性,1e4次數也是用不完的