#include #define PRVOCISLO 1000000007 typedef long long int ll; ll prvni_x, prvni_y, druhy_x, druhy_y; // Vrátí 1, pokud se daný bod nachází uvnitř obdélníka, jinak 0 int uvnitr(ll x, ll y) { return x >= prvni_x && x <= druhy_x && y >= prvni_y && y <= druhy_y; } int main() { scanf("%lld%lld%lld%lld", &prvni_x, &prvni_y, &druhy_x, &druhy_y); ll vysledek = 0; // Proměnná, do které budeme počítat černé čtverečky ll max = druhy_x > druhy_y ? druhy_x : druhy_y; // Poslední vlna v obdélníku ll min = prvni_x > prvni_y ? prvni_x : prvni_y; // První vlna v obdélníku for (ll i = min | 1; i <= max; i += 2) { // Postupně procházíme všechny černé vlny, které mohou být v obdélníku // Operace "| 1" je takzvaný binární or, v tomto případě takto // dostaneme min, pokud je min liché, a min + 1, pokud je sudé, // tedy první černou vlnu. // Pokud je daný čtvereček uvnitř obdélníku, přičteme jedničku for (ll j = prvni_x; j <= i && j <= druhy_x; ++j) { // Procházíme horní stranu zleva doprava vysledek += uvnitr(j, i); } for (ll j = prvni_y; j < i && j <= druhy_y; ++j) { // Procházíme pravou stranu odspodu nahoru vysledek += uvnitr(i, j); } // Pokud je výsledek moc veliký, vezmeme zbytek po dělení PRVOČÍSLEM vysledek %= PRVOCISLO; } printf("%lld\n", vysledek); return 0; }