Educational Codeforces Round 83 (Rated for Div. 2) C. Adding Powers(进制转换)
https://codeforces.com/contest/1312/problem/C
题目大意:
给定一个长度为n的数组a,在给定一个底数k。
一开始数组元素全部都是0,我们每一个时间i可以选择一个下标下的数字添加k的i次方,问我们能不能填成数组a的模样?
input
5
4 100
0 0 0 0
1 2
1
3 4
1 4 1
3 2
0 1 3
3 9
0 59049 810
output
YES
YES
NO
NO
YES
这道题目很明显就是考的进制转换,只要任意一个位置出现了2次以上,那就说明肯定有重复添加的嫌疑
- 还有一个很容易忘记的点就是,我们要特判这个数字到底是不是由k的几个次方相加而来?【!!!】这个尤其需要特判
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18;
const LL N=500200,M=2002;
LL a[N];
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
LL T=1;
cin>>T;
while(T--)
{
LL n,k;
cin>>n>>k;
for(LL i=1;i<=n;i++)
{
cin>>a[i];
}
map<LL,LL> mp;
bool flag=true;
for(LL i=1;i<=n;i++)
{
if(a[i]!=0)
{
vector<LL> v;
while(a[i]>1)
{
if(a[i]%k==0||a[i]%k==1)
{
v.push_back(a[i]%k);
a[i]/=k;
}
else break;
}
if(a[i]==1) v.push_back(a[i]);
else flag=false;
for(LL i=0;i<v.size();i++)
{
if(v[i]==1)
{
mp[i]++;
if(mp[i]>=2) flag=false;
}
}
v.clear();
}
}
if(flag==true) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
mp.clear();
}
return 0;
}