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; } }