Cod sursa(job #1415298)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 4 aprilie 2015 10:42:11
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.77 kb
#include <fstream>
#include <bitset>
#define DIM 210
using namespace std;

ifstream fin ("arbint.in" );
ofstream fout("arbint.out");

int N, val, cod, x, y, ok;
int A[DIM][DIM], i, j, nr, g, t, k, z;
bitset<8000010> F; int T[5];

void Cerinta_A(){
     fin >> N >> val;
     /*
          CAUT PE CE NIVEL SE AFLA VAL
     */
     i = 1; nr = 1;
     while(val >= i + N * N){
          i += N * N;
          nr ++;
     }
     /*
          AM 2 CAZURI:
          - FAC SPIRALA DIN CENTRU
          - FAC SPIRALA DE PE MARGINE
     */
     x = nr;
     if(nr % 2 == 1){
          /*
               ADICA DE PE MARGINE
          */
          g = i;
          t = 1;
     }
     else{
          /*
               ADICA DIN CENTRU
          */
          g = i + N * N - 1;
          t = -1;
     }
     for(k = 1; k <= N / 2; k ++){
          for(j = k; j <= N-k+1; j ++){
               A[k][j] = g;
               g += t;
          }
          for(i = k+1; i <= N-k+1; i ++){
               A[i][N-k+1] = g;
               g += t;
          }
          for(j = N-k; j >= k; j --){
               A[N-k+1][j] = g;
               g += t;
          }
          for(i = N-k; i > k; i --){
               A[i][k] = g;
               g += t;
          }
     }
     if(N % 2 == 1)
          A[N/2+1][N/2+1] = g;
     for(y = 1; y <= N; y ++){
          for(z = 1; z <= N; z ++){
               if(A[y][z] == val){
                    fout << x << " " << y << " " << z;
                    return;
               }
          }
     }
     return;
}

void Sieve(){
     for(i = 4; i <= 8000000; i += 2)
          F[i] = 1;
     for(i = 3; i <= 8000000; i += 2){
          if(F[i] == 0){
               for(j = i + i + i; j <= 8000000; j += i + i)
                    F[j] = 1;
          }
     }
     F[0] = F[1] = 1;
     return;
}

void Cerinta_B(){
     Sieve();
     fin >> N >> val; nr = 1;
     for(k = 1; k <= N * N * N; k += N * N){
          if(nr % 2 == 1){
               g = k;
               for(j = 1; j <= N; j ++)
                    if(F[g++] == 0)
                         T[1] ++;
               if(F[g-1] == 0)
                    T[2] ++;
               for(j = 2; j <= N; j ++)
                    if(F[g++] == 0)
                         T[2] ++;
               if(F[g-1] == 0)
                    T[3] ++;
               for(j = N - 1; j >= 1; j --)
                    if(F[g++] == 0)
                         T[3] ++;
               if(F[g-1] == 0)
                    T[4] ++;
               for(i = N - 1; i > 1; i --)
                    if(F[g++] = 0)
                         T[4] ++;
               if(F[k] == 0)
                    T[4] ++;
          }
          if(nr % 2 == 0){
               g = k + N * N - 1;
               for(j = 1; j <= N; j ++)
                    if(F[g--] == 0)
                         T[1] ++;
               if(F[g+1] == 0)
                    T[2] ++;
               for(j = 2; j <= N; j ++)
                    if(F[g--] == 0)
                         T[2] ++;
               if(F[g+1] == 0)
                    T[3] ++;
               for(j = N - 1; j >= 1; j --)
                    if(F[g--] == 0)
                         T[3] ++;
               if(F[g+1] == 0)
                    T[4] ++;
               for(i = N - 1; i > 1; i --)
                    if(F[g--] == 0)
                         T[4] ++;
               if(F[k+N*N-1] == 0)
                    T[4] ++;
          }
          nr ++;
     }
     fout << T[1] << "\n" << T[2] << "\n" << T[3] << "\n" << T[4];
     return;
}

int main(){
     Sieve();
     fin >> cod;
     switch(cod)
     {
          case 1:{Cerinta_A();break;}
          case 2:{Cerinta_B();break;}
     }
     return 0;
}