题目链接 http://poj.org/problem?id=3517
题意 约瑟夫环 要求最后删掉的那个人是谁;
方法 理解递推公式就行了 考虑这样一组数据 k = 3 是
长度为 N 的约瑟夫环 k,k+1,k+2,k+3,k+4,k+5,k-2, k-1
长度为N-1的约瑟夫环 0, 1, 2, 3, 4, 5, n-2, n-1
则 f[n] = (f[n-1]+k)%N;
可以将第一步 预处理出来; 然后 套公式就行了;
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; int arr[10004],cnt[10004],f[10004]; int main( ) { int N,M,K; while( scanf("%d%d%d",&N,&K,&M) != EOF ) { if( !N )break; for( int i = 1; i <= N; i++ ) arr[i] = i; while( M > N ) M -= N; arr[M] = -1; int k = 0; for( int i = 1; i <= N; i++ ) if( arr[i] == -1 ) { for( int j =i+1; j <= N; j++ )cnt[k++] = arr[j]; i = N+1; } for( int i = 1; i <= N; i++ ) if( arr[i] != -1 )cnt[k++] = arr[i]; else break; f[0] = 0; for( int i = 1; i < k; i++ )f[i] = (f[i-1]+K)%(i+1); cout<<cnt[f[k-1]]<<endl; } return 0; }