給n我的圍城一個環,從m號開始殺,每次隔k-1我的(從上一次被殺的人下一個開始數k下,第k我的被殺),問最後剩下的人是幾號。ios
bc的75場有一個邊形,uvalive3882 也是個變形;spa
思路:code
咱們能夠遞推解決,設 f[n] 表示的是第 n 個被殺的人是誰。blog
首先咱們將人從0開始編號,而後就是0~n-1 。string
f[ 1 ] =0;it
第一次咱們殺的是k-1號,而後咱們從新編號,從原來的第k個開始編0號,io
而後若是咱們知道剩餘的n-1 的人剩餘的是誰,那麼原來這我的的編號就是加上k後的值;class
而後再反推一下。stream
那麼,咱們知道,到最後,剩一我的的時候,他的編號確定是0,並且必須死,因此有上面的f[1] = 0;im
那麼他在上一次的編號是多少呢?
若是k =3, 那麼他的編號應該是 (0+3)%2 =1;
咱們來驗證一下, 0 、一、 0 ,0死了,1剩下了。對的。
因此。。。。就很簡單了,遞推一下就結束了,記得回頭加上1;
/************************************************************************* > File Name: uvalive3882.cpp > Author: Baiyan > 題意: > Created Time: 2016年05月28日 星期六 17時08分47秒 **********************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[10005]; int main() { int n,m,k; while(scanf("%d%d%d", &n,&k,&m)!=EOF &&( n||k||m)) { memset(f,0,sizeof(f)); f[1]= 0; for(int i=2;i<=n;i++) { if(i<n) f[i] = (f[i-1]+k)%i; else f[i] = (f[i-1]+m)%i; //這裏就是當前殺第幾我的就加幾 } printf("%d\n",f[n]+1); } return 0; }