253
Se dau două șiruri de numere naturale a[1], a[2], …, a[n] și b[1], b[2], …, b[m].
Cerința
Să se determine câte numere distincte au în comun cele două șiruri. De exemplu, șirurile a=(2,5,1,4,5,1) și b=(1,1,1,3,7,5) au în comun două numere distincte: 1 și 5.
Date de intrare
Programul citește de la tastatură numere naturale A, B, C, D, n, x, m, y. Cele două șiruri se generează astfel:
a[1] = xși, pentrui ≥ 2,a[i] = A + (a[i-1] * C + D) % (B - A + 1)b[1] = yși, pentrui ≥ 2,b[i] = A + (b[i-1] * C + D) % (B - A + 1)
Date de ieșire
Programul va afișa pe ecran numărul C, reprezentând câte numere distincte au în comun cele două șiruri.
Restricții și precizări
2 ≤ n, m ≤ 2 000 0002 ≤ A, B, C, D, x, y ≤ 10 000 000
Exemplu
Intrare
1 30 17 16 50 2 60 14
Ieșire
4
#include <bits/stdc++.h>
using namespace std;
bitset<10000001> f1 , f2 , f;
int main()
{
int A, B, C, D, n, x, m, y;
cin >> A >> B >> C >> D >> n >> x >> m >> y;
f1[x]=1 , f2[y]=1;
for(int i = 0 ; i < n ; ++i)
{
x = A + (1LL * x * C + D) % (B - A + 1);
f1[x]=1;
}
for(int i = 0 ; i < m ; ++i)
{
y = A + (1LL * y * C + D) % (B - A + 1);
f2[y]=1;
}
int cnt=0;
for(int i = 0 ; i < n ; ++i)
{
x = A + (1LL * x * C + D) % (B - A + 1);
if(f1[x]==1 && f2[x]==1 && f[x]==0)
cnt++ , f[x]=1;
}
cout << cnt;
return 0;
}
Comentarii