Educational codeforces round 83 div2C(類似進制轉換,等比數列又一個性質)

C. Adding Powers

原題目地址
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一個目標數組,要你 對一個所有元素從0開始的數組 進行一種操作。

  1. 每一步可以對一個元素增加 k^i ( i 爲每一步)( i 可以爲0)
  2. 或者第 i 步不進行操作

思路(貪心):

既然每一步的元素只能用一次,或者不用,而又是k次冪。

所以對最大一個考察時,應該滿足一個條件:

  1. 最大的元素只能由比它小的 k次冪來構成

(等比數列第n項前n-1項和有一個關係:
sum(n-1)< k^n,我做的時候想到這個結論,不過沒用上qwq)

————————————————————————————————————————————————————————
所以可以貪心的把每個元素分解爲 k的n次冪
分解方法除k取餘(除k取得餘數即是一個: k^n, 並標記是否用過)(與2進制的除2取餘相似)————————————————————————————————————————————————————————

反思

  1. 在求一個數由k^n構成時,要想到模擬進制轉換中的除k取餘。
  2. 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章