Cod sursa(job #46644)

Utilizator pustiuRadu Zaharia pustiu Data 2 aprilie 2007 20:21:59
Problema Reguli Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>
#define Nmax 500000

long long N, A[Nmax], K;
long long R[Nmax];

void citire ()
{
	FILE *in = fopen ("reguli.in", "rt");
    fscanf (in , "%lld" , &N);
    for(int i=0;i<N;i++)
    	fscanf (in,"%lld", &A[i]);
    fclose (in);
}

void calc_R ()
{
	for(int i=1;i<N-1;i++)
		if(A[i+1]-A[i]==A[1]-A[0])
		{
			R[0]++;
			R[R[0]]=i;
		}
}



void regula ()
{
	int i,k,j,ok=0;
    calc_R();
    for(k=1;k<=R[0];k++)
	{
    	ok=1;
    	for(i=1;i<=N/(R[k]+1)+2 && ok;i++)
        {
        	for(j=1;j<=R[i];j++)
            	if(A[j+1]-A[j]!=A[j+i*R[k]+1]-A[j+i*R[k]] && j+i*R[k]+1<N)
                	ok=0;
        }
    	if(ok)
        {
        	K=R[k];
            break;
        }
    }
    if(!ok)
    	K=N;
}

void afisare ()
{
	FILE *out = fopen ("reguli.out" , "wt");
    fprintf (out, "%lld\n", K);
    for(int i=0;i<K;i++)
    {
    	fprintf(out, "%lld\n", A[i+1]-A[i]);
    }
    fclose(out);
}

int main ()
{
	citire ();
    regula ();
    afisare ();
    return 0;
}