2552:Assistance Required
keyword
シミュレーション C++
概要
人々に2,3,...と番号が割り振られる。まず、番号2の人は仕事を免除され、それ以降の人は2ごとに仕事を割り振られて列から取り除かれる。次に番号3の人は…、番号5の人は…となる。仕事を免除される番号をlucky numberという。n(<3000)番目のlucky numberを求める問題。
愚直にシミュレートしてみると計算量がちょっと怪しい。実際に3000番目のlucky numberを手元で計算すると40000弱で、これでもちょっと際どいけどとりあえず投げてみる(駄目だったときは埋め込みすればよいので)。割と余裕でAC。
#define N 34000 int main(){ int i, j, skip, cnt=0, n; bool ns[N]; REP(i,N) ns[i] = true; int ans[3000]; for(i=2;cnt<3000;i++){ if(ns[i]){ ans[cnt++] = i; skip = 0; for(j=i+1;j<N;j++){ if(ns[j]){ skip++; if(skip==i){ ns[j] = false; skip = 0; } } } } } while(scanf("%d",&n)){ if(!n) break; printf("%d\n",ans[n-1]); } return 0; }