Two players, S and T, are playing a game where they makealternate moves.S plays first.
In this game, they start with an integer N. In each move, a player removesone digit from the integer and passes the resulting number to the other player.The game continues in this fashion until a player finds he/she has no digit toremove when that player is declared as the loser.
With this restriction, it’s obvious that if the number of digits in Nis odd thenS wins otherwise T wins. To make the game moreinteresting, we apply one additional constraint. A player can remove aparticular digit if the sum of digits of the resulting number is a multiple of3 or there are no digits left.
Suppose N = 1234. S has 4 possible moves. That is, he canremove 1, 2, 3, or 4. Of these, two ofthem are valid moves.
- Removal of 4 results in 123 and the sum of digits = 1 + 2 + 3 = 6; 6 isa multiple of 3.
- Removal of 1 results in 234 and the sum of digits = 2 + 3 + 4 = 9; 9 is amultiple of 3.
The other two moves are invalid.
If both players play perfectly, who wins?
Input
Thefirst line of input is an integer T(T<60) thatdetermines the number of test cases. Each case is a line that contains apositive integerN. N has at most 1000 digits and does notcontain any zeros.
Output
Foreach case, output the case number starting from 1. If S wins then output ‘S’ otherwise output ‘T’.
Sample Input Output forSample Input
3 | Case 1: S |
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
public static final boolean DEBUG = false;
public StreamTokenizer tokenizer;
public BufferedReader cin;
public PrintWriter cout;
public String s;
public void init()
{
try {
if (DEBUG) {
cin = new BufferedReader(new InputStreamReader(
new FileInputStream("d:\\OJ\\uva_in.txt")));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
cout = new PrintWriter(new OutputStreamWriter(System.out));
tokenizer = new StreamTokenizer(cin);
tokenizer.resetSyntax();
tokenizer.wordChars('0', '9');
tokenizer.whitespaceChars(0, ' ');
} catch (Exception e) {
e.printStackTrace();
}
}
public String next()
{
try {
tokenizer.nextToken();
if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null;
else if (tokenizer.ttype == StreamTokenizer.TT_WORD) return tokenizer.sval;
else return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public String input()
{
try {
return s = next();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void solve(int cas)
{
int[] cnt = new int[3];
int sum = 0;
for (int i = 0, len = s.length(); i < len; i++) {
char ch = s.charAt(i);
cnt[ch % 3]++;
sum += ch - '0';
}
int step = 0;
if (cnt[sum % 3] != 0) {
step = 1;
cnt[sum % 3]--;
}
if (step == 1) step += cnt[0];
cout.println("Case " + cas + ": " + ((step % 2 == 1) ? "S" : "T"));
cout.flush();
}
public static void main(String[] args) {
Main solver = new Main();
solver.init();
int t = (int)Double.parseDouble(solver.next());
for (int i = 1; i <= t; i++) {
solver.input();
solver.solve(i);
}
}
}