Advertisement
a53

PrimeQuery

a53
May 10th, 2020
264
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef unsigned long long i64;
  4. int n,ind;
  5. vector<i64> v,numbers;
  6. unordered_map<i64,int> pos;
  7. vector<int> aib;
  8.  
  9. inline i64 Multiply(i64 a, i64 b, i64 MOD)
  10. {
  11. i64 res(0);
  12. while(b)
  13. {
  14. if(b&1)
  15. {
  16. res+=a;
  17. if(res>=MOD)
  18. res-=MOD;
  19. }
  20. a+=a;
  21. if(a>=MOD)
  22. a-=MOD;
  23. b>>=1;
  24. }
  25. return res;
  26. }
  27.  
  28. inline i64 Powlog(i64 a,i64 b,i64 MOD)
  29. {
  30. i64 res(1);
  31. while(b)
  32. {
  33. if(b&1)
  34. res=Multiply(res,a,MOD);
  35. a=Multiply(a,a,MOD);
  36. b>>=1;
  37. }
  38. return res;
  39. }
  40.  
  41. inline bool Prim(i64 n)
  42. {
  43. if(n<2)
  44. return false;
  45. if(n==2||n==3||n==5)
  46. return true;
  47. if(n%2==0||n%3==0||n%5==0)
  48. return false;
  49. i64 d(n-1);
  50. while(d%2==0)
  51. d>>=1;
  52. for(int i=1;i<=2;++i)
  53. {
  54. bool ch(true);
  55. i64 a=2+rand()%(n-4),temp(d);
  56. i64 x=Powlog(a,temp,n);
  57. if(x==1||x==n-1)
  58. continue;
  59. while(temp!=n-1)
  60. {
  61. x=Multiply(x,x,n);
  62. temp<<=1;
  63. if(x==1)
  64. return false;
  65. if(x==n-1)
  66. {
  67. ch=false;
  68. break;
  69. }
  70. }
  71. if(ch)
  72. return false;
  73. }
  74. return true;
  75. }
  76.  
  77. void Update(int pos)
  78. {
  79. for(int i=pos;i<=ind;i+=i&-i)
  80. ++aib[i];
  81. }
  82.  
  83. inline int Query(int pos)
  84. {
  85. int sum=0;
  86. for(int i=pos;i>0;i-=i&-i)
  87. sum+=aib[i];
  88. return sum;
  89. }
  90.  
  91. int main()
  92. {
  93. ios_base::sync_with_stdio(false);
  94. ifstream f("primequery.in");
  95. f>>n;
  96. v=numbers=vector<i64>(n);
  97. for(int i=0;i<n;++i)
  98. f>>v[i],numbers[i]=v[i];
  99. f.close();
  100. sort(numbers.begin(),numbers.end());
  101. numbers.erase(unique(numbers.begin(),numbers.end()),numbers.end());
  102. for(const i64&x:numbers) /// In pos pun indicii vectorului sortat
  103. pos[x]=++ind;
  104. aib=vector<int>(ind+1); /// Vectorul care retine arborele indexat binar
  105. ofstream g("primequery.out");
  106. for(int i=0;i<n;++i)
  107. {
  108. g<<Query(pos[v[i]]-1)<<' ';
  109. if(Prim(v[i]))
  110. Update(pos[v[i]]);
  111. }
  112. g<<'\n';
  113. g.close();
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement