Cipizz

Time limit: 1.3s Memory limit: 1024MB Input: Output:

În urma succesului internațional cu pizzeria Cipizz din Craiova, cei 33 buni prieteni Dani, Andrei și Ștefan s-au decis să își deschidă fiecare câte o pizzerie nouă în parcul Romanescu. Parcul este reprezentant ca o matrice binară cu NN linii și MM coloane (indexate de la 11) unde 00 înseamnă căsuță liberă, respectiv 11 indică prezența unui copac. Fiecare dorește să își poziționeze pizzeria într-o celulă liberă (celulă marcată cu 00). Parcul din imagine va fi reprezentat astfel:

Mai mult, există un personaj negativ, Chilly Willy, care vrea să le saboteze pizzeriile, motiv pentru care aceștia s-au hotărât să își poziționeze pizzeriile în 33 puncte distincte astfel încât fiecare din ei să aibă în vizor celelalte 22 pizzerii, adică pentru oricare două pizzerii, să nu existe niciun copac pe linia dreaptă dintre acestea. De asemenea, pentru a își maximiza profitul, cei 33 au dedus că așezarea optimă a pizzeriilor trebuie sa aibă forma unui triunghi dreptunghic isoscel cu o catetă pe o linie, una pe o coloană, cu ipotenuză pe o pseudo-diagonală paralelă cu diagonala principală și cu unghiul de 90°90\degree în colțul stânga-jos. Mai jos se pot vedea câteva exemple de astfel de amplasări valide:

Cerință

Vorba lungă sărăcia omului, Bogdănel este responsabil să se ocupe de toate aceste lucruri, iar acesta vă roagă să aflați în câte moduri putem să poziționăm cele 33 pizzerii astfel încât să respectăm criteriile menționate (sau, în mod formal, câte triunghiuri de forma cerută cu perimetrul plin de valori de 0 există în această matrice binară).

Detalii de implementare

Va trebui să implementezi funcția

int count_triangles(int N, int M, std::vector<int> x, std::vector<int> y);

care primește ca parametri:

  • NN și MM, dimensiunile matricei;
  • xx și yy, vectori de dimensiune KK cu semnificația că există un copac în matrice la poziția (xi,yi)(x_i, y_i) pentru 0i<K0 \leq i < K.

Funcția trebuie să returneze numărul de moduri în care se pot poziționa cele 33 pizzerii modulo 1 000 000 0071 \ 000 \ 000 \ 007. Comisia va apela funcția o singură dată per test.

Restricții și precizări

  • 1N,M1 000 000 0001 \leq N, M \leq 1 \ 000 \ 000 \ 000
  • 0K5 0000 \leq K \leq 5 \ 000
  • 0KNM0 \leq K \leq N \cdot M
  • 1xiN1 \leq x_i \leq N și 1yiM1 \leq y_i \leq M,  0i<K\forall \ 0 \leq i < K
  • Pozițiile copacilor sunt distincte.
# Punctaj Restricții
1 2 1NM1001 \leq N \leq M \leq 100
2 3 1N,M5001 \leq N, M \leq 500
3 14 1N,M2 0001 \leq N, M \leq 2 \ 000
4 7 1N301 \leq N \leq 30
5 7 N=MN = M și xi=yi, 0i<Kx_i = y_i, \forall \ 0 \leq i < K
6 5 K=0K = 0
7 31 0K500 \leq K \leq 50
8 7 0K2000 \leq K \leq 200
9 9 0K1 0000 \leq K \leq 1 \ 000
10 15 Fără restricții suplimentare.

Exemplu

input

3 7 3
2 2
1 6
2 4

output

6

Explicație

Aici se pot vedea cele 6 soluții posibile:

0000x10  0000x10  0000010  0000010  0000010  0000010
0101xx0  0101xx0  x101000  01x1000  0101x00  01010x0
0000000  0000xxx  xx00000  00xx000  0000xx0  00000xx

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