題目鏈結:
題目大意:一共n人。從1號開始,每k個人t掉。問最後的人。n超大。
解題思路:
除去超大的n之外。就是個約瑟夫環的裸題。
約瑟夫環遞推公式,n為人數,k為步長。
f(1)=0
f(n)=[f(n-1)+k]%i i∈[2,n]
f(n)還要經過起始位置修正,設起始位置為s,即ans=[f(n)+s]%n。
基本約瑟夫環優化就是當k=1的時候,每次遞推就是在+1,可以直接算出來快速跳過,f(n)=f(1)+n-1
當n超大的時候,可以照著這種思路快速簡化遞推過程。在遞推後期,f(x)+k在很長的週期內那麼這些週期合併後的結果相當於f(x)+m*k。可以快速跳過。條件限制是: f(x)+m*k可以推出來:
當m=1時,條件限制: f(x)+k當m=2是,條件限制: f(x+1)+k當m=m時,條件限制:f(x)+m*k化簡有m<(i-f(x)-1)/(k-1),若能整除,就是(i-f(x)-1)/(k-1)-1,否則就是(i-f(x)-1)/(k-1)直接取整。
這樣,i+=m,f(x)+=m*k,快速跳過了中間過程。
若i+m>n,說明快速跳越界了,這時候可以直接算出f(n)=f(x)+(n-i-1)*m。
#include "cstdio
"#define ll long longll solve(ll n,ll k,ll s=1
)
else
}return (ans+s)%n;
}int
main()
}
HDU5643 約瑟夫環變形
題意 變形的約瑟夫環,最初為每個人編號 1到n 第 i 次刪去報號為 i 的人,然後從它的下乙個人開始重新從1開始報號,問最終剩下第幾號人 思路 媽的,我推不出來,笨方法,打表儲存,不過以後做題也可以這麼用哦 include include include include include defin...
pku1012 hdu1443約瑟夫環問題
pku1012我寫了個鍊錶的暴力來直接打表發現只能打到k 9,到10就執行不了了 在下面,而網上這一篇寫的打表居然可以,下面是我的草稿 include include struct link head,p,fp int f 15 void create int n p next head int s...
hdu 5643 約瑟夫環加強版
e acmer 在比賽中竟然沒有除錯正確,把函式裡面分配的區域性變數來作為鍊錶的內容了顯然函式一結束這塊記憶體就被 了.code include include include include include include include include include include inclu...