Cod sursa(job #93131)

Utilizator alzwdedVlad Mesco alzwded Data 17 octombrie 2007 19:56:56
Problema Reguli Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>

FILE *f,*g;
int *x,*a,n;
void citire();
void diferente();
void cauta_an();
int cautareavansata(int);
void ok(int);

main(){
	f=fopen("reguli.in","r");
	g=fopen("reguli.out","w");

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

	return 0;
}

void citire(){
	int i;

	fscanf(f,"%d",&n);
	x=(int*)malloc(n*sizeof(int));
	a=(int*)malloc(n*sizeof(int));
	for(i=0;i<n;++i){
		fscanf(f,"%d",&x[i]);
	}

	fclose(f);
}

void diferente(){
	int i;

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

int first_i(){
	int k;

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

	for(j=first_i();j<n-1;j++){
		const int 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(int j){
	int i;

	fprintf(g,"%d\n",j+1);
	for(i=0;i<=j;++i){
		fprintf(g,"%d\n",a[i]);
	}

	fclose(g);
	exit(0);
}

int cautareavansata(int j){
	int 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;
}