Pagini recente » Cod sursa (job #1351) | Cod sursa (job #2882889) | Cod sursa (job #2392674) | Cod sursa (job #485060) | Cod sursa (job #1737498)
#include <fstream>
#include <cstring>
#define DIM 100005
using namespace std;
ifstream f ("nextseq.in");
ofstream g ("nextseq.out");
int fn[DIM] , sn[DIM] , unu[DIM] , v[DIM] , qq[DIM];
int n , m , p , x , nr , BASE;
bool comp (int a[] , int b[]) {
if (a[0] != b[0]) {
return 0;
}
for (int i = 1; i <= a[0]; ++i) {
if (a[i] != b[i]) {
return 0;
}
}
return 1;
}
void adun (int a[] , int b[]);
void verif (int a[]);
int main() {
unu[1] = unu[0] = 1;
f >> n >> m >> p;
for (int i = 1; i <= n; ++i) {
f >> x;
++v[x];
BASE = max(BASE , x);
}
++BASE;
for (int i = m; i >= 1; --i) {
f >> x;
fn[i] = x;
}
fn[0] = m;
for (int i = p; i >= 1; --i) {
f >> x;
sn[i] = x;
}
sn[0] = p;
adun(fn , unu);
while (!comp(fn , sn)) {
verif(fn);
adun(fn , unu);
}
g << nr;
return 0;
}
void adun (int a[] , int b[]) {
int t = 0;
a[0] = max(a[0] , b[0]);
for (int i = 1; i <= a[0]; ++i) {
a[i] = a[i] + b[i] +t;
t = a[i] / BASE;
a[i] %= BASE;
}
while (t) {
a[++a[0]] = t % BASE;
t /= BASE;
}
}
void verif (int a[]) {
memset(qq , 0 , sizeof(qq));
for (int i = 1; i <= a[0]; ++i) {
qq[a[i]] = 1;
}
for (int i = 0; i <= BASE; ++i) {
if (qq[i] > v[i]) {
return;
}
}
++nr;
}