Cod sursa(job #93135)

Utilizator alzwdedVlad Mesco alzwded Data 17 octombrie 2007 20:11:03
Problema Reguli Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdlib>
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <alloc.h>

fstream f("reguli.in",ios::in),g("reguli.out",ios::out);
long long *x,*a;
long n;
void citire();
void diferente();
void cauta_an();
long cautareavansata(long);
void ok(long);

main(){

	citire();
	diferente();
	cauta_an();

	return 0;
}

void citire(){

	long i;

	f>>n;
	x=(long long*)malloc(n*sizeof(long long));
	a=(long long*)malloc(n*sizeof(long long));
	for(i=0;i<n;++i){
		f>>x[i];
	}

	f.close();
}

void diferente(){
	long i;

	for(i=1;i<n;++i){
		a[i-1]=x[i]-x[i-1];
	}
}

long first_i(){
	long k;

	for(k=1;k<n-1;++k){
		if(a[k]!=a[0]){
			return k;
		}
	}
	return 0;
}
void cauta_an(){
	long j;
	const long i=0;

	for(j=first_i();j<n-1;j++){
		const long d=j-i+1;

		if(i+d>n||j+d>n){
			if(cautareavansata(j)){
				ok(j);
			}
			continue;
		}

		if(a[i]==a[i+d]&&a[j]==a[j+d]){
			ok(j);
		}
	}
}

void ok(long j){
	long i;

	g<<j+1<<'\n';
	for(i=0;i<=j;++i){
		g<<a[i]<<'\n';
	}

	g.close();
	exit(0);
}

long cautareavansata(long j){
	long i,k=0;

	for(i=0;i<n;++i){
		if(k>j){
			k=0;
		}

		if(x[i] != x[i-1] + (i%k==0)?a[k]:a[i%k]  ){
			return 0;
		}
	}

   return 1;
}