Cod sursa(job #338650)

Utilizator hadesgamesTache Alexandru hadesgames Data 6 august 2009 13:11:32
Problema Reguli Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
using namespace std;
#define FOR(i,a,b) for (i=(a);i<=(b);i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
typedef pair<int,int> ii;
FILE *in,*out;
int a[500005],b[500005],pi[500005],ok[500005];
int main()
{
	int n,i,y,r,c,minv;
	in=fopen("reguli.in","r");
	out=fopen("reguli.out","w");
	fscanf(in,"%d",&n);
	FOR(i,1,n)
		fscanf(in,"%d",&a[i]);
	FOR(i,1,n-1)
		b[i]=a[i+1]-a[i];
	n--;
	pi[1]=y=0;
	FOR(i,2,n)
	{
		while (y&&b[y+1]!=b[i])
			y=pi[y];
		if (b[y+1]==b[i])
			y++;
		pi[i]=y;
	}
	minv=n;
	y=pi[n];
	while(y)
	{
		ok[y]=1;
		minv=min(minv,n-y);
		y=pi[y];
	}
	FOR(i,1,n)
	{
		r=n%i;
		c=n/i;
		if (c==1)
			continue;
		if (n-r==(n-r-pi[n-r])*c&&ok[n-i]&&pi[n-r]!=0)
			minv=min(minv,i); 
	}
	fprintf(out,"%d\n",minv);
	FOR(i,1,minv)
		fprintf(out,"%d\n",b[i]);
	fclose(in);
	fclose(out);
        return 0;
}