public void invite(Person person) { if (peopleInvited == 0) for (int tshirt : person.getAllTshirts()) waysBuffer[tshirt] = 1; else { for (int tshirt = 1; tshirt < Person.TSHIRT_LIMIT; tshirt++) { // waysToPartyWithT = ways[tshirt]; // waysToPartyWithout = waysToParty - waysToPartyWithT; // ways[tshirt] = waysWithoutT * 1 + waysWithT * (totalTshirts - 1); if (person.has(tshirt)) waysBuffer[tshirt] = ModMath.add( waysToParty, ModMath.mul((long) (person.getTshirtCount() - 2), ways[tshirt])); else waysBuffer[tshirt] = ModMath.mul(ways[tshirt], (long) person.getTshirtCount()); } } peopleInvited++; waysToParty = getNewWaysToParty(person, waysToParty); for (int i = 0; i < ways.length; i++) ways[i] = waysBuffer[i]; System.err.println("Invited " + person.toString()); for (int i = 0; i < 20; i++) System.err.print(ways[i] + " "); System.err.println("| " + waysToParty); }
private long getNewWaysToParty(Person person, long oldWaysToParty) { long newWaysToParty = 0; for (int tshirt : person.getAllTshirts()) newWaysToParty = ModMath.add(newWaysToParty, oldWaysToParty, -ways[tshirt]); return newWaysToParty; }
/** * Returns x to the <code>exponent</code> power. * * @param x an integer * @param exponent an integer * @return x to the <code>exponent</code> power. */ public int pow(int x, int exponent) { return ModMath.pow(x, exponent, p); }
/** * Returns x times the inverse of y mod p. * * @param x an element of the field * @param y an element of the field * @return x / y mod p */ public Integer divide(int x, int y) { Integer inv = ModMath.inverse(y, p); if (inv != null) return ModMath.multiply(x, inv, p); return null; }
public int multiply(int x, int y) { return ModMath.multiply(x, y, p); }
public int subtract(int x, int y) { return ModMath.subtract(x, y, p); }
public int add(int x, int y) { return ModMath.add(x, y, p); }
/** * Returns true if x is an element of the field; false otherwise. * * @param x an element of the field * @return true if x is an element of the field; false otherwise. */ public boolean isElement(int x) { return ModMath.isElement(x, p); }