C. Adding Powers
題意:
給你一個目標數組,要你 對一個所有元素從0開始的數組 進行一種操作。
- 每一步可以對一個元素增加 k^i ( i 爲每一步)( i 可以爲0)
- 或者第 i 步不進行操作
思路(貪心):
既然每一步的元素只能用一次,或者不用,而又是k次冪。
所以對最大一個考察時,應該滿足一個條件:
- 最大的元素只能由比它小的 k次冪來構成
(等比數列第n項和前n-1項和有一個關係:
sum(n-1)< k^n,我做的時候想到這個結論,不過沒用上qwq)
————————————————————————————————————————————————————————
所以可以貪心的把每個元素分解爲 k的n次冪:
分解方法除k取餘(除k取得餘數即是一個: k^n, 並標記是否用過)(與2進制的除2取餘相似)————————————————————————————————————————————————————————
反思
- 在求一個數由k^n構成時,要想到模擬進制轉換中的除k取餘。
- k進制每一位下的1—代表10進制下k^n次冪
AC(咩哥代碼)
#include <iostream>
#include <cstring>
#define mst(x,a) memset(x,a,sizeof(x))
#define For(i,x,y) for(int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
ll vis[110];
const ll INF=1e16;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
mst(vis,0);
ll n,k;
cin>>n>>k;
int flag=1;
For(i,1,n)
{
ll a;
cin>>a;
for(int j=0; a&&j<=100; j++)
{
vis[j]+=a%k;
a/=k;
}
}
For(i,0,100)
{
if(vis[i]>1)
{
flag=0;
break;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}