this returns 5997, and the System.out.println says 3000000
the correct answer is 55374
i tried changing
System.out.println(ways[j]);
to
System.out.println(ways[j].toString());
but get the same answer
i am guessing
if(ways[j].mod(limit) == BigInteger.ZERO)
is where the problem is, but not sure

I'd say you've nailed it. int is a primitive type and can be compared using ==. BigInteger is an object, for which the == operator compares references. You need to use the equals method instead.

if(ways[j].mod(limit).equals(BigInteger.ZERO))
hmmm...i thought that would fix it but i get the same answer. i tried this also
if(ways[j].remainder(limit).equals(BigInteger.ZERO))
same result

that difference is correct. #76 wants all combinations of 2 numbers that equal 100(up to 99 + 1).
#78 includes the case of all coins in one stack(100)
i might try it using long, but my guess is the number will be too big