1674 - 年终大奖
时间限制 : 1 秒
内存限制 : 32 MB
ACM俱乐部又要发年终大奖了!这次获大奖的人从n名会员中按以下规则选出:
首先,让会员们围成一个大圈,按0,1,2...n-1编号。然后,随机抽取一个数m,让编号为0的会员开始报数。每次喊到m的那个会员出列,不再回到圈中,从他的下一个人开始,继续1...m报数....这样下去....直到剩下最后一个会员为止。这名会员就能获得大奖了。
题目输入
输入有多组数据。
每组数据一行,包含2个整数n(1<=n<=100,000),m(1<=m<=100,000),n,m分别表示会员的人数(编号0,1,2...n-1)和数m(如上文所述)。
题目输出
对应每组数据,输出最后拿到大奖的会员编号。
输入/输出样例
输入格式
5 7 7 8 43 18
输出格式
3 3 18
C语言解答
/* * ===================================================================================== * * Filename: 902-2.c * * Description: hahahhaha * * Version: 1.0 * Created: 2013/9/3 0:12:15 * Revision: none * Compiler: gcc * * Author: mdk-vim.cpp-c (mdk), mengdaikun@gmail.com * Company: cjluacm-vim-mdk * * ===================================================================================== */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int main() { //freopen("a.in","r",stdin); int n,m; int i; while(~scanf("%d %d",&n,&m)) { int s = 0; for(i = 2 ; i <= n ;i++) { s = (s+m) % i; } printf("%d\n",s); } return 0; }
C++解答
#include <stdio.h> /////////////////////////////////////////////////////////////////////// // n integers (0, 1, ... n - 1) form a circle. Remove the mth from // the circle at every time. Find the last number remaining // Input: n - the number of integers in the circle initially // m - remove the mth number at every time // Output: the last number remaining when the input is valid, // otherwise -1 /////////////////////////////////////////////////////////////////////// int LastRemaining_Solution2(int n, unsigned int m) { // invalid input if(n <= 0 || m < 0) return -1; // if there are only one integer in the circle initially, // of course the last remaining one is 0 int lastinteger = 0; // find the last remaining one in the circle with n integers for (int i = 2; i <= n; i ++) lastinteger = (lastinteger + m) % i; return lastinteger; } int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) printf("%d\n",LastRemaining_Solution2(a,b)); return 0; }
Java解答
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cScanner = new Scanner(System.in); int n ,m; while(cScanner.hasNext() ) { n= cScanner.nextInt(); m= cScanner.nextInt(); getNum(n, m); } } public static void getNum(int n,int m) { ArrayList<Integer> list = new ArrayList<Integer>(); for( int i=0;i< n;i++) list.add(i); int position =0; while(list.size() !=1) { int nSize= list.size(); position =( position + m)% nSize -1; if(position == -1) { position = nSize -1; } int remove = list.remove(position); position = position %(nSize-1); } System.out.println(list.get(0)); } }