Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define endl "\n"
- ll Find(int l, int r, int val, vector <ll> &pow)
- {
- int ans;
- while(l <= r)
- {
- int mid = (l+r)/2;
- if (pow[mid] <= val)
- {
- ans = mid;
- cout<<pow[mid]<<" "<<val<<" ";
- r = mid - 1;
- }
- else
- {
- cout<<pow[mid]<<" "<<val<<" ";
- l = mid + 1;
- }
- cout<<"left = "<<l<<", right = "<<r<<endl;
- }
- return ans;
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- int t;
- cin>>t;
- while(t--)
- {
- int n,k;
- cin>>n>>k;
- vector <ll> a(n);
- for (int i = 0; i < n; i++)
- cin>>a[i];
- sort(a.begin(), a.end(), greater<>());
- vector <ll> pow;
- for (ll i = 0, tmp = 1; tmp <= min(a[0],(ll)1e16); i++)
- {
- pow.push_back(tmp);
- tmp *= 1ll * k;
- }
- reverse(pow.begin(), pow.end());
- for (ll l : pow) cout<<l<<" ";
- cout<<endl;
- vector <bool> check(pow.size(), 1);
- int left = 0, right = pow.size() - 1;
- bool flag = true;
- for (int i = 0; i < n && flag; i++)
- {
- while(a[i] > 0)
- {
- int pos = Find(left, right, a[i], pow);
- while (pos <= right && check[pos] == 0) pos++;
- if (pos > right)
- {
- flag = false;
- break;
- }
- if (a[i] <= pow[pos] && check[pos] == 1)
- {
- a[i] -= pow[pos];
- check[pos] = 0;
- }
- }
- }
- if (!flag) cout<<"NO"<<endl;
- else cout<<"YES"<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement