Informatică, întrebare adresată de teo2000, 9 ani în urmă

Imi puteti explica problema asta? mai jos este si rezolvarea in C++ dar vreau sa stiu de ce se rezolva asa.


Cerința

Dându-se n, un număr natural, să se afle numărul de pătrate care au colţurile coordonate numere întregi cuprinse între 0 şi n inclusiv.

Date de intrare

Programul citește de la tastatură un număr natural n.

Date de ieșire

Programul va afişa pe ecran un număr natural, reprezentând numărul de pătrate formate cu cele (n+1)2 puncte. Deoarece rezultatul poate fi mare, se va afişa răspunsul modulo 666013.

Restricții și precizări
•1 ≤ n ≤ 2.000.000.000
•Pentru teste în valoare de 30 de puncte, n ≤ 10
•Pentru teste în valoare de 75 de puncte, n ≤ 2.000.000




Exemplu

Intrare
2


Ieșire
6


Explicație

Pătratele ce se formează au colţurile:
1.(0, 0), (0, 1), (1, 1), (1, 0)
2.(0, 1), (0, 2), (1, 2), (1, 1)
3.(1, 0), (1, 1), (2, 1), (2, 0)
4.(1, 1), (1, 2), (2, 2), (2, 1)
5.(0, 0), (0, 2), (2, 2), (2, 0)
6.(0, 1), (1, 2), (2, 1), (1, 0)

REZOLVAREA IN C++
#include
using namespace std;
unsigned long long n1, n2;
int main()
{ const int m = 666013;
long long n;
cin >> n;
n++;
n1=n*n;
n2=n1-1;
if(n1%4==0)
n1=n1/4;
else
n2=n2/4;
if(n1%3==0)
n1=n1/3;
else
n2=n2/3;
cout<<((n1%m)*(n2%m))%m;
return 0;
}

Răspunsuri la întrebare

Răspuns de express
1
Nu inteleg de ce nu citesti descrierea solutiei. De obicei se cer rezolvari (surse) tu ne oferi o sursa si vrei explicatii. Cele mai bune explicatii le ai citind ceea ce a vrut in rezolvare de fapt autorul problemei. Adica citind "descrierea solutiei"...pentru ca este normal ca la o problema ceruta sa dau si sursa...iti trimit sursa mea la aceasta problema insotita de descrierea solutiei. Te sfatuiesc ca alta data sa ceri doar rezolvari (surse).Succes!

Formula de bază utilizată pentru rezolvarea problemei devine în final n * (n + 1)2 * (n + 2) / 12 după generalizarea formulei anterioare. Însă, pentru a putea efectua operaţia modulo corespunzător (împărţirile nu se pot face în modulo) decât dacă ne folosim de inversul modular, dar aici nu este nevoie. Luăm un vector t[4] = {n, n + 1, n + 2, n + 1} şi apoi împărţim individual numerele cu divizorii primi ai lui 12.

Ştim datorită principiului cutiei că unul dintre primele 3 numere este divizibil cu 3. Îl împărţim pe acesta cu 3 şi apoi ne rămâne să împărţim cu 4 altceva. Acel altceva va fi cele doua numere pare. Dacă n este par, îl împărţim pe t[0] şi pe t[2] la 2, în caz contrar pe t[1] şi t[3]. Rezultatul va fi dat în final de produsul celor 4 numere în modul.

#include <iostream>
#define mod 666013
using namespace std;
long long n, i, rez, x1;

int main()
{
    cin >> n;
    n ++;
    n = n % mod;
    for(i = 2; i <= n; i ++)
    {
        x1 = ((n - i + 1) * (n - i + 1)) % mod;
        x1 = (x1 * (i - 1)) % mod;
        rez = rez + x1;
        rez = rez % mod;
    }
    cout << rez;
    return 0;
}


Alte întrebări interesante