File tree 1 file changed +64
-0
lines changed
C Programs/C Programs - 3 1 file changed +64
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include < cstdio>
2
+ #include < vector>
3
+ #include < set>
4
+
5
+ using namespace std ;
6
+
7
+ int get_mex (set <int > &state_possible)
8
+ {
9
+ int i = 0 ;
10
+
11
+ while (true )
12
+ {
13
+ if (state_possible.count (i) == 0 )
14
+ return i;
15
+
16
+ i++;
17
+ }
18
+ }
19
+
20
+ void compute (vector <int > &grundy, vector <int > &fibonacci, int MAX_STONES)
21
+ {
22
+ grundy[0 ] = 0 ;
23
+
24
+ for (int i = 1 ; i <= MAX_STONES; i++)
25
+ {
26
+ set <int > state_possible;
27
+
28
+ for (int j = 0 ; fibonacci[j] <= i; j++)
29
+ {
30
+ state_possible.insert (grundy[i - fibonacci[j]]);
31
+ }
32
+
33
+ grundy[i] = get_mex (state_possible);
34
+ }
35
+ }
36
+
37
+ int main ()
38
+ {
39
+ vector <int > fibonacci (35 );
40
+ fibonacci[0 ] = fibonacci[1 ] = 1 ;
41
+ for (int i = 2 ; i < 35 ; i++)
42
+ {
43
+ fibonacci[i] = fibonacci[i - 1 ] + fibonacci[i - 2 ];
44
+ }
45
+
46
+ const int MAX_STONES = 3e6 ;
47
+ vector <int > grundy (MAX_STONES);
48
+ compute (grundy, fibonacci, MAX_STONES);
49
+
50
+ int no_of_piles;
51
+ scanf (" %d" , &no_of_piles);
52
+
53
+ int nim_sum = 0 ;
54
+ while (no_of_piles--)
55
+ {
56
+ int stones;
57
+ scanf (" %d" , &stones);
58
+
59
+ nim_sum ^= grundy[stones];
60
+ }
61
+
62
+ printf (nim_sum == 0 ? " Vinit\n " : " Ada\n " );
63
+ return 0 ;
64
+ }
You can’t perform that action at this time.
0 commit comments