Cod sursa(job #18587)

Utilizator cos_minBondane Cosmin cos_min Data 18 februarie 2007 12:42:17
Problema Reguli Scor 80
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.75 kb
#include <stdio.h>
#include <vector>
#include <iterator>
using namespace std;

#define in "reguli.in"
#define out "reguli.out"

vector<int> a;
vector<int> v;
int n, k;
int dr, st;

void ReadData();
int BS();
void Solve();
int Ok(int);

int main()
{
    ReadData();
    Solve();
    
}

void ReadData()
{
     freopen(in,"r",stdin);
     freopen(out,"w",stdout);
     
     scanf("%d", &n);
     
     a.resize(n+1);
     v.resize(n+1);
     
     scanf("%d", &v[1]);
     for ( int i = 2; i <= n; i++ )
     {
         scanf("%d",&v[i]);
         a[i-1] = v[i] - v[i-1];
     }
}

void Solve()
{
     int t = BS();
     
    // printf("%d ", Ok(3));
     
     printf("%d\n", t);
     for ( int i = 1; i <= t; i++ )
         printf("%d\n",a[i]);
}

int BS()
{
    int val = 1;
    
    /*while ( st <= dr )
    {
          int mij = (st+dr)/2;
          
         // printf("%d ", mij );
          
          if ( !Ok(mij) )
          {
               st = mij + 1;
          }
          else
          {
              if ( val > mij ) val = mij;
              dr = mij - 1;
          }
    }*/
    
    bool gasit = 0;
    
    while ( !gasit )
    {
          if ( Ok(val) ) gasit = 1;
          else           val++;
    }
    
    return val;
}

int Ok(int k)
{
    int maxim=0;
    
    for ( int i = 1; i <= k; i++ )
    {
        for ( int j = i; j < n; j+= k )
        {
            if ( a[i] != a[j] ) return 0;
            if ( i == k ) maxim = j;
        }
    }
    
   /* if ( maxim == 0 ) return 1;
    else
    {
        for ( int i = 1, j = maxim; j <= n; i++, j++ )
        {
            if ( a[i] != a[j] ) return 0;
        }
    }*/
    
    return 1;
}