Cod sursa(job #1004698)

Utilizator geniucosOncescu Costin geniucos Data 3 octombrie 2013 15:27:01
Problema Reguli Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.77 kb
#include<cstdio>
#include<cstring>
using namespace std;
int i,j,T,n,P,R,Z[500009];
long long x1,ul,a[500009];
int min(int a,int b){if(a<b) return a;return b;}
void afis(int per)
{
    printf("%d\n",per);
    for(i=1;i<=per;i++)
        printf("%lld\n",a[i]);
}
int main()
{
freopen("reguli.in","r",stdin);
freopen("reguli.out","w",stdout);
scanf("%d",&n);
scanf("%d",&ul);
for(i=2;i<=n;i++)
{
    scanf("%d",&x1);
    a[i-1]=x1-ul;
    ul=x1;
}
n--;
for(i=2;i<=n;i++)
{
    if(R>=i) Z[i]=min(Z[i-P+1],R-i+1);
    while(a[i+Z[i]]==a[Z[i]+1]&&i+Z[i]<=n) Z[i]++;
    if(i+Z[i]-1>R){R=i+Z[i]-1;P=i;}
}
for(i=1;i<=n;i++)
{
    for(j=1;j*i<n;j++)
        if(Z[j*i+1]<min(i,n-j*i)) break;
    if(j*i<n) continue;
    afis(i);
    return 0;
}
return 0;
}