Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define vi vector<int>
  6. #define ll long long
  7. #define pb push_back
  8. #define mp make_pair
  9. #define ii pair<int,int>
  10.  
  11. void erase_v3(vector<long long> &vec, long long value)
  12. {
  13. auto pr = equal_range(vec.begin(), vec.end(), value);
  14. vec.erase(pr.first, pr.second);
  15. }
  16.  
  17. vector<long long> all_divisors(long long n, long long limit){
  18. vector<long long> ans;
  19. for(long long a = 1; a*a <= n; a++){ // comparação que evita o uso de doubles, a <= sqrt(n) é o mesmo que a*a <= n
  20. if((n % a == 0)&&(a <= limit)){
  21. long long b = n / a;
  22. ans.push_back(a);
  23. if((a != b)&&(b <= limit)) ans.push_back(b);
  24. }
  25. }
  26. sort(ans.begin(), ans.end()); // frescura para retornar os divisores ordenados como na primeira implementação
  27. return ans;
  28. }
  29.  
  30. vector<long long> EraseCommonDivisors(vector<long long> v1,const vector<long long> &v2)
  31. {
  32. for (int i = 0; i < v2.size(); ++i)
  33. {
  34. erase_v3(v1,v2[i]);
  35. }
  36.  
  37. return v1;
  38. }
  39.  
  40. int main(){
  41.  
  42. int n,m,x,y;
  43. int j =0;
  44. map<int ,vector<long long>> divs;
  45.  
  46.  
  47. scanf("%d %d",&m,&n);
  48.  
  49. for (int i = 0; i < m; ++i)
  50. {
  51. scanf("%d %d",&x,&y);
  52. divs[i] = all_divisors(x,n);
  53. j = i;
  54. while((y > 0)&&(j > 0)){
  55. divs[i] = EraseCommonDivisors(divs[i],divs[j-1]);
  56. y--;
  57. j--;
  58. }
  59. }
  60.  
  61. for (int i = 0; i < m; ++i)
  62. {
  63. cout << divs[i].size() << endl;
  64. }
  65.  
  66. return 0;
  67. }
  68.  
  69.  
  70. /*
  71. compilar
  72. g++ arquivo.cpp -std=c++11 -o executavel
  73. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement