Educational Codeforces Round 83 (Rated for Div. 2).C. Adding Powers

http://codeforces.com/contest/1312/problem/C题目链接

这道题有许多种解法,在此介绍一种类似题都能通用的方法。相信许多人也最想看这种方法。

在介绍之前,先理解一下当k=2时的情况。

k=2,n=23时   有23=2^4+2^2+2^1+2^0;

这个式子能说明什么呢 在二进制中23表示为 10111

看出来什么没有? 1的位置正好对应的是上面式子中指数的数字-1。(4,2,1,0)

而如果每次对这个数%2,就能得到最后一个数是否为1,从而知道需不需要加上对应的幂。之后只需要右移一位,即除以2,就能继续剩余的判断。

记录下每个指数使用的次数,超过1次便不合要求。从而就能解这道题。

那么可以知道,当k>2的时候,其实也就是在k进制下进行类似操作。

上代码:

#include<bits/stdc++.h>
using namespace std;
long long a[105],c[105];
int main()
{
    int t;
    cin>>t;
    while(t)
    {
        t--;
        memset(c,0,sizeof(c));
        int n,k;
        cin>>n>>k;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            int j=0;
            while(a[i])
            {
                c[j]+=a[i]%k;
                a[i]/=k;
                j++;
            } 
        }int flag=0;
        for(int i=0;i<60;i++)
        {
            if(c[i]>1)
            flag=1;
        }
        if(flag==0)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
 } 

 

posted @ 2020-03-10 15:24  _LH2000  阅读(156)  评论(0编辑  收藏  举报