Pagini recente » Cod sursa (job #2583820) | Cod sursa (job #149831) | Cod sursa (job #3204782) | Cod sursa (job #1081649) | Cod sursa (job #1210085)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("nextseq.in");
ofstream g("nextseq.out");
int Vcar[10005];
int Array[10005];
int Power[1000005];
int Result[1000005],Result2[1000005],Aux1[1000005],Aux2[1000005],N,M,P,A[10005],B[10005],one[]={1,1,0};
void Read()
{
int i;
f>>N>>M>>P;
for(i=1;i<=N;i++)
f>>Array[i];
sort(Array+1,Array+N+1);
}
void buildVcar()
{
int i;
for(i=1;i<=N;i++)
Vcar[Array[i]]=i;
}
void mul(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= 10)
A[i] = (t += A[i] * B) % 10;
A[0] = i - 1;
}
void sub(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i++) {
A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
A[i] += (t = A[i] < 0) * 10;
}
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
A[i] = (t += A[i] + B[i]) % 10;
A[0] = i - 1;
}
void readAB()
{
int i;
for(i=1;i<=M;i++)
{
int value;
f>>value;
A[i]=Vcar[value];
}
for(i=1;i<=P;i++)
{
int value;
f>>value;
B[i]=Vcar[value];
}
}
void countResultB()
{
Power[0]=Power[1]=Aux2[0]=Aux2[1]=1;
mul(Aux2,B[P]);
add(Result,Aux2);
for(int i=P-1;i>=1;i--)
{
mul(Power,N);
for(int i=Aux2[0];i>Power[0];i--)
Aux2[i]=0;
for(int j=0;j<=Power[0];j++)
Aux2[j]=Power[j];
mul(Aux2,B[i]-1);
add(Result,Aux2);
add(Result,Power);
}
}
void countResultA()
{
Power[0]=Power[1]=Aux1[0]=Aux1[1]=1;
mul(Aux1,A[M]);
add(Result2,Aux1);
for(int i=M-1;i>=1;i--)
{
mul(Power,N);
for(int i=Aux1[0];i>Power[0];i--)
Aux1[i]=0;
for(int j=0;j<=Power[0];j++)
Aux1[j]=Power[j];
mul(Aux1,A[i]-1);
add(Result2,Aux1);
add(Result2,Power);
}
for(int i=1;i<=Power[0];i++)
Power[i]=0;
Power[0]=0;
}
int main()
{
Read();
buildVcar();
readAB();
countResultA();
countResultB();
sub(Result,Result2);
sub(Result,one);
for(int i=Result[0];i>=1;i--)
g<<Result[i];
return 0;
}