Bitsir

Time limit: 0.1s Memory limit: 256MB Input: bitsir.in Output: bitsir.out

Considerăm numerele naturale NN, XX, YY, M1,M2,,MNM_1, M_2, \ldots, M_N. Șirul de numere naturale A1,A2,,ANA_1, A_2, \ldots, A_N este numit bun dacă următoarele condiții sunt satisfăcute simultan:

  • A1 OR A2 OR  OR AN=XA_1 \text{ OR } A_2 \text{ OR } \ldots \text{ OR } A_N = X, unde  OR \text{ OR } reprezintă operația "sau pe biți".
  • A1 XOR A2 XOR  XOR AN=YA_1 \text{ XOR } A_2 \text{ XOR } \ldots \text{ XOR } A_N = Y, unde  XOR \text{ XOR } reprezintă operația "sau exclusiv pe biți".
  • Ai AND Mi=MiA_i \text{ AND } M_i = M_i, pentru 1iN1 \leq i \leq N, unde  AND \text{ AND } reprezintă operația "și pe biți".

Se dau NN, XX, YY și M1,M2,,MNM_{1}, M_{2}, \ldots, M_{N}, cu semnificația din enunț.

Cerință

Să se determine dacă există șiruri bune, respectiv să se determine numărul de șiruri bune, modulo 1 000 000 0071 \ 000 \ 000 \ 007.

Date de intrare

Fișierul de intrare bitsir.in conține pe prima linie trei numere naturale NN, XX și YY, și pe a doua linie numerele naturale M1,M2,,MNM_{1}, M_{2}, \ldots, M_{N}. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire bitsir.out conține exact două linii. Fișierul conține pe prima linie mesajul DA, dacă există șiruri bune, sau mesajul NU în caz contrar, iar pe a doua linie numărul de șiruri bune determinat. Valoarea de pe a doua linie a fișierului trebuie să fie un număr natural cuprins în intervalul [0,1 000 000 006][0, 1 \ 000 \ 000 \ 006].

Restricții și precizări

  • 1N100 0001 \leq N \leq 100 \ 000;
  • 0X,Y23010 \leq X, Y \leq 2^{30}-1;
  • 0MiX0 \leq M_i \leq X;
  • Dacă prima linie a fișierului de ieșire este corectă, dar a doua linie a fișierului de ieșire nu este corectă, se acordă 50%50\% din punctajul corespunzător testului respectiv.
  • Dacă prima linie a fișierului de ieșire nu este corectă, se acordă 0%0\% din punctajul corespunzător testului respectiv.
  • Operația OR\text{OR} este reprezentată în C/C++ prin |. Spre exemplu, 12 OR 10=1412 \text{ OR } 10 = 14.
  • Operația XOR\text{XOR} este reprezentată în în C/C++ prin ^. Spre exemplu, 12 XOR 10=612 \text{ XOR } 10 = 6.
  • Operația AND\text{AND} este reprezentată în C/C++ prin &. Spre exemplu, 12 AND 10=812 \text{ AND } 10 = 8.
# Punctaj Restricții
1 9 X=Y=M1=M2==MN=0X = Y = M_1 = M_2 = \cdots = M_N = 0
2 9 X=1,Y=M1=M2==MN=0X = 1, Y = M_1 = M_2 = \cdots = M_N = 0
3 9 NX20N \cdot X \leq 20
4 18 X=0X = 0
5 12 N4N \leq 4, X63X \leq 63
6 15 N=2N = 2, X2231X \leq 2^{23}-1
7 12 0X,Y,M1,M2,,MN10 \leq X, Y, M_1, M_2, \ldots, M_N \leq 1
8 16 Fără restricții suplimentare

Exemplul 1

bitsir.in

3 11 10
8 2 0

bitsir.out

DA
12

Explicație

Șirurile bune sunt:

  • 8,3,18, 3, 1;
  • 8,11,98, 11, 9;
  • 9,2,19, 2, 1;
  • 9,3,09, 3, 0;
  • 9,10,99, 10, 9;
  • 9,11,89, 11, 8;
  • 10,3,310, 3, 3;
  • 10,11,1110, 11, 11;
  • 11,2,311, 2, 3;
  • 11,3,211, 3, 2;
  • 11,10,1111, 10, 11;
  • 11,11,1011, 11, 10.

Exemplul 2

bitsir.in

3 7 5
2 3 6

bitsir.out

NU
0

Explicație

Nu există șiruri bune.

Exemplul 3

bitsir.in

10 31 24
5 17 1 6 0 30 12 15 8 23

bitsir.out

DA
8388608

Log in or sign up to be able to send submissions!