Cod sursa(job #1724210)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 2 iulie 2016 15:31:30
Problema NextSeq Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <algorithm>
#define MAX 6000000
#define MaxL 10000
using namespace std;

typedef int Big[40005];
char f[MAX];
int pos=0,v[MaxL],first[MaxL],last[MaxL];
Big ANSWER,AUX;
void r(int &nr)
{
	nr=0;
	while(f[pos]<'0'||f[pos]>'9')
		pos++;
	while(f[pos]>='0'&&f[pos]<='9')
		nr=nr*10+f[pos++]-'0';
}
int lenght(int nr)
{
	int l=1;
	while(nr>0)
		l*=10;
	return l;
}
int binsearch(int value)
{
	int lw=1,mid,hi=v[0];
	while(lw<=hi)
	{
		mid=(lw+hi)>>1;
		if(v[mid]<value)
			lw=mid+1;
		else if(v[mid]>value)
			hi=mid-1;
		else return mid;
	}
	return lw;
}
void Divide(Big &A,Big B,int nr)
{
	int t=0,size=0;
	for(int i=B[0];i>0;i--)
	{
		t=t*10+B[i];
		if(t>=nr)
		{
			size++;
			A[size]=t/nr;
			t%=nr;
		}
	}
	for(int i=size+1;i<=A[0];i++)
		A[i]=0;
	A[0]=size;
}
void Multiply(Big &A,Big B,int nr)
{
	int i=1,t=0;
	while(i<=B[0]||t>0)
	{
		A[i]=B[i]*nr+t;
		t=A[i]/10;
		A[i]%=10;
		i++;
	}
	A[0]=i-1;
}
void Sum(Big &A,Big B)
{
	int i=1,t=0;
	while(i<=A[0]||i<=B[0]||t>0)
	{
		A[i]+=t+B[i];
		t=A[i]/10;
		A[i]%=10;
		i++;
	}
	A[0]=i-1;
}
void solve()
{
	Big power={1,1},aux;
	int ways;
	for(int i=1;i<=first[0]+1;i++)
		Multiply(power,power,v[0]);
	for(int i=first[0]+1;i<last[0];i++)
	{
		Sum(ANSWER,power);
		Multiply(power,power,v[0]);
	}
	Big Power={1,1};
	for(int i=first[0];i>0;i--)
	{	
		Big aux={1,1};
		ways=v[0]-binsearch(first[i]);
		Multiply(aux,Power,ways);
		Multiply(Power,Power,v[0]);
		Sum(ANSWER,aux);
	}
	Big POW={1,1};
	for(int i=1;i<last[0];i++)
		Multiply(POW,POW,v[0]);
	for(int i=1;i<=last[0];i++)
	{
		Big aux={1,1};
		ways=binsearch(last[i])-1;
		if(ways>0)
		{
			Multiply(aux,POW,ways);
			Sum(ANSWER,aux);
		}
		Divide(aux,POW,v[0]);
		for(int j=1;j<=aux[0];j++)
			POW[aux[0]-j+1]=aux[j];
		for(int j=aux[0]+1;j<=POW[0];j++)
			POW[j]=0;
		POW[0]=aux[0];
	}
}
int main()
{
    freopen("nextseq.in","r",stdin);
    freopen("nextseq.out","w",stdout);
	fread(f,1,MAX,stdin);
	r(v[0]);r(first[0]);r(last[0]);
	for(int i=1;i<=v[0];i++)
		r(v[i]);
	sort(v+1,v+1+v[0]);
	for(int i=1;i<=first[0];i++)
		r(first[i]);
	for(int i=1;i<=last[0];i++)
		r(last[i]);
	solve();
	for(int i=ANSWER[0];i>0;i--)
		printf("%d",ANSWER[i]);
    return 0;
}