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;
}
posted @ 2022-10-21 17:36  Vijurria  阅读(14)  评论(0编辑  收藏  举报