OI養老專題02 約瑟夫問題求倖存者

2022-06-18 16:24:13 字數 1128 閱讀 1714

如題。人數為n(1<=n<=30000),共k(1<=k<=30000)組資料,所報的數m恒為2,只要求輸出倖存者。

如果你還不知道什麼是約瑟夫問題...——

如果直接暴力列舉,那麼時間複雜度就為o(nm)=o(n),所有資料一共o(knm)=o(kn)。遇上這道題就爆掉了。

那麼怎麼解決這種大資料的題呢?我們先手玩一把n個人的約瑟夫問題。由於每次對於n取模後的值在[0,n-1]之間,所以我們乾脆讓所有人的編號減1,也就是:0,1,2,......n-1。並且假設他們也從0~n-1報數。那麼第一輪報數之後,出局的人就是:m%n-1。設tn=m%n,那麼去掉了編號為tn-1的人之後,得到的序列就為:tn,tn+1......n-2,n-1,0,1,2......tn-2(tn-1出局了,所以沒有),而他們報的數依次為0,1,2......n-1。不難發現,兩個序列每個對應的元素相差為tn。

現在我們再手玩一把人數為n-1的約瑟夫問題。第一輪報數後,出局的人就是m%(n-1)-1。類似地,設tn-1=m%(n-1),剩下的序列就為:tn-1,tn-1+1......n-3,n-2,0,1,2......tn-1-2,他們報的數依次為0,1,2......n-2。兩個序列每個對應的元素相差為tn-1。那麼我們腦補一下遞迴的過程,最後我們會遞迴到邊界:人數為1的情況。此時的倖存者就是0(編號減了1)。所以我們可以考慮通過人數少的來推出人數多的。設人數為n-1時的倖存者為ans,通過剛才的推導,不難發現當人數為n時倖存者就是(ans+m%n)%n。所以我們可以根據人數為1時倖存者為0遞推上去,時間複雜度為o(n)。

不難發現,當n非常大,而m又小得可憐(比如本題)時,ans每次增加m之後對n取模還是等於ans+m,也就是說ans只增加了m。如果還是一次一次地加m的話,後面對n取模的語句始終是用不到的。所以不妨加快這個過程?設ans+m*x=n+x+1,也就是說ans最多增加x次之後仍然小於n,即對n取模的語句無用。至於為什麼n要加x,是因為往上遞推了x次之後,人數也會增加x(注意我們是從人少的情況往上遞推!)。分離引數之後得x<(n-ans)/(m-1),x>=(n-ans)/(m-1)-1,可得x=floor((n-ans)/(m-1))。所以我們每次累加上x*m即可,並把迴圈的引數i調高x。不過要注意一些細節:

1.當ans+m>n時直接上遞推式子即可。

2.當i+x>=n時就累加不到x次了,只能加n-i+1次。

中國養老產業觀察

快速老齡化給我國經濟社會發展帶來巨大衝擊,同時也蘊含廣闊商機。據清華大學和樂善網權威專家測算,全國1.69億老年人口可撬動1萬億元規模養老產業,但由於目前產品種類少 服務層次低等 軟肋 我國養老產業尚處於 沉睡 階段,亟待啟用。養老產業蘊含萬億商機。以江蘇為例,截至去年底,江蘇省60歲以上老年人口已...

新導智慧型智慧型養老解決方案,智慧型養老系統

智慧型養老解決方案是以智慧型 構建養老雲渠道生態體系,整合健康辦理 裝置辦理 健康陳述 報警功用 體檢功用 長途醫療等,集辦理 運營 服務於一體。為養老院 社群 地產等供給高科技的智慧型化手段,完成高效快捷的超值服務與辦理 為 老人供給安全 舒適 快捷 智慧型的居住環境,為家屬供給完善 定心的 老人...

積極探索健康養老新模式,推動健康養老產業智慧型化建設

全國衛生與健康大會強調,沒有全民健康,就沒有全面小康。而隨著我國老齡人口的逐漸增多,實現健康養老,是實現全民健康的關鍵內容。2018 年 3 月 28 日國民健康與養老產業峰會於內蒙古自治區呼和浩特市新城賓館成功舉程式設計客棧辦,以促進行業交流,推動我國養老產業和健康產業的快速發展。本次大會碩果累累...