Advertisement
a53

secvente2

a53
Feb 28th, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <fstream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. // rezolvare cu ciurul lui Eratostene
  6.  
  7. #define NMAX 30001
  8. ifstream f("secvente2.in");
  9. ofstream g("secvente2.out");
  10. int t,n,p,k,m,i,x,D; // n-atatea numere de pe foaie
  11. // p-baza componentei putere a numarului p-prim
  12. // -cate numere prime vor fi in secventele cerute
  13. int a[15001]; // a- contine pozitiile numerelor p-prime
  14. int prime[NMAX];
  15. // prim[i]=true/false ne va spune daca i este numar prim
  16.  
  17. void numereprime() // ciurul lui Eratostene
  18. {
  19. int i,j; // pentru generarea numerelor prime
  20. double rad;
  21. rad=sqrt(NMAX);
  22. for(i=1;i<=NMAX;i++) // toate numerele le consideram prime la inceput
  23. prime[i]=1;
  24. i=1; // plec de la inceputul vectorului
  25. while(i<=rad) // se lucreaza doar pana la radical din n
  26. {
  27. do
  28. {
  29. i++;
  30. }
  31. while(!prime[i]); // caut urmatorul numar prim la rand
  32. j=i*i; // primul numar care nu mai este prim este patratul lui
  33. while(j<=NMAX) // apoi plecand de la el
  34. {
  35. prime[j]=0; // il marchez ca fiind neprim (e multiplu de i)
  36. j=j+i; // si marchez din i in i
  37. }
  38. }
  39. }
  40. int pprim(int x)
  41. {
  42. if(x==1) return 0; // numarul 1 nu e pprim
  43. else
  44. {
  45. while(x%p==0) // simplific cu p
  46. x=x/p;
  47. return prime[x]; // si verific daca e prim
  48. // - de data asta se accepta si 1
  49. }
  50. }
  51.  
  52. int main()
  53. {
  54. numereprime(); //generez tabelul numerelor prime cu ciurul lui Eratostene
  55. f>>D;
  56. for(t=1;t<=D;t++)
  57. {
  58. f>>n>>p>>k;
  59. m=0;
  60. for(i=1;i<=n;i++)
  61. {
  62. f>>x;
  63. if(pprim(x))
  64. {
  65. m++;
  66. a[m]=i; // am memorat pozitia de aparitie a unui numar p-prim
  67. }
  68. }
  69. if(m-k+1<=0)
  70. g<<0<<'\n';
  71. else
  72. g<<m-k+1<<'\n'; // din m numere prime pot crea m-k+1 secvente de lungime k
  73.  
  74. for(i=1;i<=m-k+1;i++)
  75. g<<a[i]<<' '<<a[i+k-1]<<'\n'; // astea sunt extremitatile secventelor
  76. }
  77. f.close();
  78. g.close();
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement