303
Cerința
Se dau n numere naturale. Pentru fiecare număr k dat, să se afle cea mai lungă secvenţă de numere naturale consecutive din şirul 1,2,3,...,k, astfel încât orice număr din secvenţă să nu fie prim.
Date de intrare
Fișierul de intrare prim997.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.
Date de ieșire
Fișierul de ieșire prim997.out va conține pe linia i, primul număr din secvenţă şi lungimea secvenţei, pentru cel de-al i-lea număr de pe linia a doua a fişierului de intrare.
Restricții și precizări
1 ≤ n ≤ 100.000- numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât
10.000.000 - dacă sunt mai multe secvenţe de lungime maximă cu numere consecutive neprime, se va afişa cea cu primul număr din secvenţă minim
Exemplu
prim997.in
3 4 11 30
prim997.out
1 1 8 3 24 5
Explicație
În şirul 1,2,3,4 secvenţa de lungime maximă cu numere neprime este 1, în şirul 1,2,3,4,5,6,7,8,9,10,11 secvenţa este 8,9,10, iar în şirul 1,2,3,4,...,30 este 24,25,26,27,28.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("prim997.in");
ofstream cout("prim997.out");
int st[10001001] , l[10001101] ;
bool a[10001001];
int n;
int main()
{
int max=10001001;
for(int i = 2 ; i <= max ; i++) a[i] = 1;
for(int i = 2 ; i*i <= max ; i++)
if(a[i] == 1)
for(int j = i*i; j <= max; j += i) a[j]=0;
int lun = 0 , lmax=0;
for(int i = 1 ; i <= 10000000 ; ++i)
{
l[i]=l[i-1] , st[i]=st[i-1];
if(a[i]==0)
{
lun++;
if(lun>lmax)
lmax=lun , l[i]=lmax , st[i]=i-lmax+1;
}
if(a[i]==1)
lun=0;
}
cin >> n;
for(int i = 0 ; i < n ; ++i)
{
int x;
cin >> x;
cout << st[x] << ' ' << l[x] << endl;
}
return 0;
}
Comentarii