Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define vi vector<int>
- #define ll long long
- #define pb push_back
- #define mp make_pair
- #define ii pair<int,int>
- void erase_v3(vector<long long> &vec, long long value)
- {
- auto pr = equal_range(vec.begin(), vec.end(), value);
- vec.erase(pr.first, pr.second);
- }
- vector<long long> all_divisors(long long n, long long limit){
- vector<long long> ans;
- 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
- if((n % a == 0)&&(a <= limit)){
- long long b = n / a;
- ans.push_back(a);
- if((a != b)&&(b <= limit)) ans.push_back(b);
- }
- }
- sort(ans.begin(), ans.end()); // frescura para retornar os divisores ordenados como na primeira implementação
- return ans;
- }
- vector<long long> EraseCommonDivisors(vector<long long> v1,const vector<long long> &v2)
- {
- for (int i = 0; i < v2.size(); ++i)
- {
- erase_v3(v1,v2[i]);
- }
- return v1;
- }
- int main(){
- int n,m,x,y;
- int j =0;
- map<int ,vector<long long>> divs;
- scanf("%d %d",&m,&n);
- for (int i = 0; i < m; ++i)
- {
- scanf("%d %d",&x,&y);
- divs[i] = all_divisors(x,n);
- j = i;
- while((y > 0)&&(j > 0)){
- divs[i] = EraseCommonDivisors(divs[i],divs[j-1]);
- y--;
- j--;
- }
- }
- for (int i = 0; i < m; ++i)
- {
- cout << divs[i].size() << endl;
- }
- return 0;
- }
- /*
- compilar
- g++ arquivo.cpp -std=c++11 -o executavel
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement