Problem:
FizzBuzz

「Fizz Buzz」と言われる数字を使ったゲームがあります。このゲームは複数のプレイヤーで数字を1 から順にひとつずつ数え上げていくもので、各プレイヤーは直前のプレイヤーが発言した次の数字をひとつだけ発言します。その時、3 で割り切れる場合は 「Fizz」, 5 で割り切れる場合は 「Buzz」、両者で割り切れる場合は「FizzBuzz」と数の代わりに発言しなければなりません。例えば、最初の 16 までの発言は以下のようになります。

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, ・・・

太郎君は友達と「Fizz Buzz」をして遊ぶことにしました。太郎君たちはルールを次のように決めました。

「間違えた人は脱落する。その次の人は間違えた数の次の数から始める。つまり、1, 2, 3 と発言した場合、3 で間違えたので次は 4 から始めることになる。」

このルールに従ってゲームを行うのですが、ゲームに慣れていないため、間違えたことに気付かないことがあり、公平な判断ができません。そこであなたは太郎君たちがこのゲームを楽しめるように、決められた発言回数が終わった時点で残っていた人を出力するプログラムを作成することにしました。

プレイヤー数、ゲーム中に発言された回数、それぞれの発言を入力とし、入力が終わった時点で残っているプレイヤーの番号を小さい順に出力するプログラムを作成してください。ただし、プレイヤーには 1 から番号が割り振られており、発言順番も 1 番目のプレイヤーから順に行い、一通り発言が終わると、再度 1 番目のプレイヤーから発言することとします。順番の回ってきたプレイヤーが既に脱落している場合は、その次のプレイヤーが発言します。また、このプログラムは、プレイヤーが一人になった時点で、その後の発言を無視しなければなりません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。
各データセットは以下の形式で与えられます。

m n
s1
s2
:
sn

1 行目にプレイヤー数 m (2 ≤ m ≤ 1000) と発言回数 n (1 ≤ n ≤ 10000) が与えられます。

続く n 行に i 番目の発言 s1 が与えられます。 si は整数、Fizz、Buzz、または FizzBuzz を示す文字列（8文字以下）です。

データセットの数は 50 を超えません。

Output

入力データセットごとに、指定された発言回数まで入力されたときに残っているプレイヤーの番号を小さい順に出力します。

Sample Input

5 7
1
2
Fizz
4
Buzz
6
7
3 5
1
2
3
4
5
0 0

Output for the Sample Input

2 3 4 5
1

Solution in JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		while(true) {
			int m = stdIn.nextInt();
			int n = stdIn.nextInt();
			if(m == 0 && n == 0) {
				break;
			}
			
			boolean[] isLive = new boolean[m];
			for(int i = 0; i < m; i++) {
				isLive[i] = true;
			}
			String[] say = new String[n];
			for(int i = 0; i < n; i++) {
				say[i] = stdIn.next();
			}
			int deadC = 0;
			int now = 0;
			for(int i = 1; i <= n; i++) {
				boolean isFizz = i%3==0;
				boolean isBuzz = i%5==0;
				boolean isFizzBuzz = false;
				if(isFizz && isBuzz) {
					isFizzBuzz = true;
					isFizz = false;
					isBuzz = false;
				}
				while(true) {
					if(isLive[now]) {
						break;
					}
					now++;
					if(now >= m) now = 0;
				}
				if(deadC == m - 1) {
					break;
				}
				if(isFizzBuzz&&!say[i-1].equals("FizzBuzz")) {
					isLive[now] = false;
					deadC++;
					continue;
				}
				else if(isFizz&&!say[i-1].equals("Fizz")) {
					isLive[now] = false;
					deadC++;
					continue;
				}
				else if(isBuzz&&!say[i-1].equals("Buzz")) {
					isLive[now] = false;
					
					deadC++;
					continue;
				}
				else if(!isFizzBuzz&&!isBuzz&&!isFizz&&!say[i-1].equals(String.valueOf(i))) {
					isLive[now] = false;
					deadC++;
					continue;
				}
				now++;
				if(now >= m) {
					now = 0;
				}
			}
			boolean isFirst = true;
			for(int i = 0; i < m; i++) {
				if(isLive[i] && isFirst) {
					System.out.print((i+1));
					isFirst = false;
				}
				else if(isLive[i]) {
					System.out.print(" " + (i+1));
				}
			}
			System.out.println();
		}
	}
	

}