示例#1
0
  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);
  }
示例#2
0
 private long getNewWaysToParty(Person person, long oldWaysToParty) {
   long newWaysToParty = 0;
   for (int tshirt : person.getAllTshirts())
     newWaysToParty = ModMath.add(newWaysToParty, oldWaysToParty, -ways[tshirt]);
   return newWaysToParty;
 }
示例#3
0
 /**
  * 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);
 }
示例#4
0
 /**
  * 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;
 }
示例#5
0
 public int multiply(int x, int y) {
   return ModMath.multiply(x, y, p);
 }
示例#6
0
 public int subtract(int x, int y) {
   return ModMath.subtract(x, y, p);
 }
示例#7
0
 public int add(int x, int y) {
   return ModMath.add(x, y, p);
 }
示例#8
0
 /**
  * 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);
 }