import java.util.*;
/** A Java version of SeqRandomMods, using ArrayList.
* The output from SeqRandomMods should match the output of this application.
*/
public class SeqRandomModsJ
{
public static ArrayList<Integer> arr = new ArrayList<Integer>();
static int modulo (int i, int j) {
int m = i % j;
return m < 0 ? m + j : m;
}
static int modulo (int i) {
return modulo(i, arr.size());
}
static int checksum() {
int sum = 0;
int sz = arr.size();
for (int i = 0; i < sz; i++)
sum += i*arr.get(i);
return sum;
}
static final int size = 1000;
static final int iterations = 10*size;
static final boolean DEBUGGING = false;
public static void main (String[] argv) {
for (int i = 0; i < size; i++)
arr.add(i);
for (int i = 0; i < iterations; i++) {
int j = i * 99907;
int k = j * 79943;
int op = modulo(j, 7);
int val = 987 * arr.get(modulo(k));
if (DEBUGGING)
System.out.println("i: "+i+" arr len="+arr.size()
+" checksum:"+checksum()+" val:"+val
+" j:"+j+"->"+modulo(j)+" op:"+op);
j = modulo(j);
if (op == 0) // replace single
arr.set(j, val);
else if (op == 1) // insert single before
arr.add(j, val);
else if (op == 2) // insert single after
arr.add(j, val);
else if (op == 3) {
k = modulo(k);
for (; k > j; k--)
arr.remove(j);
}
else if (op == 4) { // delete single
if (j < arr.size())
arr.remove(j);
}
else if (op == 5 || op == 6) { // multiple insert or replace
int n = modulo(k, 333);
ArrayList<Integer> tmp = new ArrayList<Integer>();
for (int i2 = 0; i2 < n; i2++)
tmp.add(i2*k);
if (op == 6) {
k = modulo(k);
for (; k > j; k--)
arr.remove(j);
}
arr.addAll(j, tmp);
}
}
int sum = 0;
int sz = arr.size();
for (int i = 0; i < sz; i++)
sum += i*arr.get(i);
System.out.println("Final array length "+sz+" check-sum: "+sum+'.');
}
}