TopcoderArchiveVisit Topcoder
SRM1 Nov 2010
SRM 508

YetAnotherORProblem

Problem statement, definition, constraints, and public examples.

Problem Statement

NOTE: This problem statement contains subscripts that may not display properly if viewed outside of the applet.

You're given a long[] R containing N elements. Count the number of sequences A0, A1, ..., AN-1 such that each Ai is an integer satisfying 0 &le Ai &le R[i] and A0 + A1 + ... + AN-1 = A0 | A1 | ... | AN-1. The '|' symbol stands for bitwise OR of the operands. Return the number of such sequences modulo 1,000,000,009.

Definition

Class:
YetAnotherORProblem
Method:
countSequences
Parameters:
long[]
Returns:
int
Method signature:
int countSequences(long[] R)
(be sure your method is public)

Notes

  • If a and b are single bits then a | b is defined as max(a, b). For two integers, A and B, in order to calculate A | B, they need to be represented in binary: A = (an...a1)2, B = (bn...b1)2 (if the lengths of their representations are different, the shorter one is prepended with the necessary number of leading zeroes). Then A | B = C = (cn...c1)2, where ci = ai | bi. For example, 10 | 3 = (1010)2 | (0011)2 = (1011)2 = 11.

Constraints

  • R will contain between 2 and 10 elements, inclusive.
  • Each element of R will be between 1 and 10^18, inclusive.

Examples

  1. {3,5}
    Returns: 15
    All the possible sequences are: {0,0}, {0,1}, {0,2}, {0,3}, {0,4}, {0,5}, {1,0}, {1,2}, {1,4}, {2,0}, {2,1}, {2,4}, {2,5}, {3,0}, {3,4}.
  2. {3,3,3}
    Returns: 16
  3. {1,128}
    Returns: 194
  4. {26,74,25,30}
    Returns: 8409
  5. {1000000000,1000000000}
    Returns: 420352509
Back to all problems