Cod sursa(job #47501)

Utilizator mika17Mihai Alex Ionescu mika17 Data 3 aprilie 2007 19:21:04
Problema NextSeq Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <stdio.h>
#include <string.h>
#define fin "nextseq.in"
#define fout "nextseq.out"
#define NMAX 10001
int S[NMAX],A[NMAX],B[NMAX],bza[NMAX],bzb[NMAX],sol;
FILE * f=fopen(fin,"r"), *g=fopen(fout,"w");
void read(int X[])
{
  int i;
  for(i=1;i<=X[0];++i)
  fscanf(f,"%d",&X[i]);
}

void readData()
{
 fscanf(f,"%d %d %d",&S[0],&A[0],&B[0]);
 read(S);
 read(A);
 read(B);
 fclose(f);
}

void qsort(int a[],int st,int dr)
{
 int i=st,j=dr,p=a[(st+dr)/2];
 while(i<j)
 {
  while(a[i]<p) ++i;
  while(a[j]>p) --j;
  if(i<=j)
  {
   int aux = a[i] ; a[i] = a[j] ; a[j] = aux;
   ++i; --j;
  }
 }
 if(st<j) qsort(a,st,j);
 if(i<dr) qsort(a,i,dr);
}

int bsearch(int X[],int st,int dr,int x)
{
 int step = 1,p = st;
 while(2 * step <= dr) step<<=1;
 for(;step;step>>=1)
 if(p + step <= dr & X[p]<x & X[p+step] <= x)
  p+=step;
 return p;
}

void get_ind(int X[],int ind[])
{
 int i;
 ind[0] = X[0];
 for(i=1;i<=X[0];++i)
     ind[i] = bsearch(S,1,S[0],X[i]) - 1;      //baza S[0]
}

void sub(int X[],int Y[],int Z[])
{
	Z[0] = X[0];
	for(int i=1,t=0;i<=X[0];++i)
		Z[i] += t =((Z[i]=X[i]-Y[i]-t)<0) * S[0]; //scadere in baza S[0]
	while(!Z[Z[0]] & Z[0]>1) --Z[0];
}	

long long pow[10];
void calculate()
{
	pow[0] = 1;
	for(int i=1;i<10;++i)
		pow[i] = pow[i-1]*S[0];
}	

void reverse(int X[])
{
 for(int i=1;i<=X[0]/2;++i)
 {
  int aux = X[i]; X[i] = X[X[0]-i+1]; X[X[0]-i+1] = aux;
 }
}

int getSol(int X[])
{
	int baza=0;
	for(int i=1;i<=X[0];++i)
		baza+=X[i]*pow[i-1];
return baza;
}

void solve()
{
 int D1[NMAX],D2[NMAX],res[NMAX],i,j;
 if(bza[0]==bzb[0])
 {
	 memset(res,0,sizeof res);
	 sub(bzb,bza,res);
	 sol = getSol(res)-1;
	 return;
 }	 
 memset(D1,0,sizeof D1);
 memset(res,0,sizeof res);
 D1[0]=bza[0];
 for(i=1;i<=bza[0];++i)
	 D1[i]=S[0]-1;
 sub(D1,bza,res);
 sol+=getSol(res);
 for(i=bza[0]+1;i<bzb[0];++i)
 {
         memset(D1,0,sizeof D1);
	 memset(D2,0,sizeof D2);
	 D1[0]=D2[0]=i;
	 for(j=1;j<=i;++j)
		D1[j] = 0 , D2[j]=S[0]-1;
         memset(res,0,sizeof res);
	 sub(D2,D1,res);
	 sol+=getSol(res)+1;
 }
 memset(D2,0,sizeof D2);
 D2[0]=bzb[0];
 memset(res,0,sizeof res);
 sub(bzb,D2,res);
 sol+=getSol(res);
}


void writeData()
{
 fprintf(g,"%d",sol);
 fclose(g);
}

int main()
{
 readData();
 qsort(S,1,S[0]);
 get_ind(A,bza);
 reverse(bza);
 get_ind(B,bzb);
 reverse(bzb);
 calculate();
 solve();
 writeData();
 return 0;
}