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
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;
}