Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #pragma GCC optimize("O3")
  5.  
  6. using namespace std;
  7.  
  8. int n, k, i, r;
  9. vector<int> ft, t;
  10.  
  11. bool bs(int64_t a, int64_t b){
  12.     long long res = 1;
  13.     for(;b;b>>=1){
  14.         res*=(b&1)*a;
  15.         if(res>n||a>n) return true;
  16.         a*=a;
  17.     }
  18.     return false;
  19.     }
  20. void f(int64_t x, int i, int cnt, vector<vector<bool>> &dd){
  21.     if(cnt==k){ ++r; return;}
  22.     for(int j = i+1; j < ft.size(); ++j){
  23.         if(i==-1||__gcd(ft[i],ft[j])==1&&x*ft[j]<=int64_t(n)) f(x*ft[j],j,cnt+1,dd);
  24.         if(dd[k-cnt][j]||ft[j]*x>n) break;
  25.     }
  26. }
  27.  
  28. int main(){
  29.     cin >> n >> k;
  30.     for(i = 1; i*i < n; ++i){
  31.         if(n%i) continue;
  32.         ft.push_back(i);
  33.         t.push_back(n/i);
  34.     }
  35.     if(i*i==n) ft.push_back(i);
  36.     ft.insert(ft.end(),t.rbegin(),t.rend());
  37.     vector<vector<bool>> dd(k+1,vector<bool>(ft.size()));
  38.     for(int i = 1; i <= k; ++i)
  39.         for(int j = 0; j < ft.size(); ++j)
  40.             dd[i][j] = bs(ft[j],i);
  41.  
  42.     f(1,-1,0,dd);
  43.     cout << r;
  44.     return 0;
  45.  
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement