Rezolvare completă PbInfo #2519 wisp

Aventurile Antoniei (cap. 1)

Antonia, o elevă în clasa a noua, plictisită de testele și de lecțiile de la chimie, se decide să creeze un joc. Ea alege două numere naturale nenule, n și k, cu ajutorul cărora construiește o matrice pătratică n x n în formă de spirală (dinspre exterior înspre interior, ca în figura de mai jos). Apoi, fata umple matricea cu numere naturale nenule consecutive, pornind de la k. Scopul jocului este să calculeze suma elementelor de pe diagonala principală, însă fata nu are la dispoziție decât 0.1 secunde până când doamna profesor va observa că nu este atentă la ore. Pentru n = 6 și k = 1, matricea ar arăta astfel:



Cerința

Ajutați-o pe Antonia să calculeze elementele de pe diagonala principală – până să fie prinsă!

Date de intrare

Fișierul wisp.in va conține pe o singură linie numerele n și k, separate printr-un spațiu, unde n reprezintă numărul de linii, respectiv de coloane al matricii, iar k este valoarea primului element, situat pe linia 1, coloana 1.

Date de ieșire

Fișierul de ieșire wisp.out va conține un singur număr S, suma elementelor de pe diagonala principală.

Restricții și precizări

  • Pentru teste în valoare de 10 puncte: n ≤ 10, k = 1;
  • Pentru încă 10 puncte: n ≤ 15, k ≤ 1.000;
  • Pentru alte 30 puncte: n ≤ 1000, k ≤ 108;
  • Pentru restul de 50 de puncte: n ≤ 1.000.000, k ≤ 1014;
  • Pentru toate testele: n ≥ 4, k≥ 1;
  • Se garantează faptul că S ≤ 1019.

Acesta reprezintă primul capitol din Aventurile Antoniei. Următorul capitol va apărea cât de curând!


Exemplu

wisp.in

6 1

wisp.out

128

Explicație

Matricea va arăta ca în imaginea anterioară.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema wisp:

// Solutie oficiala 100p (non-recursiva)
// Propusa de: elev Vintila Valentin

#include <fstream>

using namespace std;

int main()
{
    long long i;
    unsigned long long n, k, S, x = 1;
    ifstream fin("wisp.in");
    fin >> n >> k; fin.close();

    // Pentru a porni de la o matrice n x n care are primul
    // element 1, trebuie sa il eliminam pe k din ecuatie:
    S = n * (k - 1) + 1;

    // Pas catre urmatorul element
    i = n + n - 2;

    // Simplificam calculele
    if(n % 2 == 0) 
    {
        do
        {
            S += (x += i);
            S += (x += i);
        } while((i -= 4) != 2);
        S += x + 2;
    }
    else
    {
        do
        {
            S += (x += i);
            S += (x += i);
        } while(i -= 4);
    }

    ofstream fout("wisp.out"); fout << S;
    fout.close(); return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2519 wisp

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2519 wisp de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!