1. 程式人生 > 其它 >AcWing 3727. 乘方相乘(進位制)

AcWing 3727. 乘方相乘(進位制)

參考:https://www.acwing.com/problem/content/video/3730/

題目

給定一個長度為 n 的陣列 v1,v2,…,vn。
初始時,陣列中的所有元素都為 0。
接下來,可以對該陣列進行若干次如下操作------對於第 i 次操作(i 從 0 開始),你可以:
要麼選擇其中一個元素 vpos,將其增加 k^i。
要麼不選擇任何元素,直接跳過此次操作。
你可以隨時停止操作(不進行任何操作也可以)。
現在,給定 k 的值以及一個目標陣列 a1,a2,…,an。
請問,能否通過上述操作,將陣列 v 轉化為陣列 a。

輸入輸出

輸入:
第一行包含整數 T,表示共有 T 組測試資料。
每組資料第一行包含兩個整數 n,k。
第二行包含 n 個整數 a1,a2,…,an。
輸出:


每組資料輸出一行結果,能將陣列 v 轉化為陣列 a,則輸出 YES,否則輸出 NO。

思路

可以將陣列a的每個元素轉化成k進位制,進行第i次操作,只能使某個數的k進位制第i位上+1。因此,只要判斷所有數的k進位制第i位上之和是否位1,等於1或0說明可以轉化,大於1說明不能轉化。
將思路轉化為程式碼是一種程式設計思維
用一個數組s[i],記錄第i位上的數之和

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;
const int N = 100;  //ai的k進位制不會超過100位
int s[N];

int main()
{
    int T;
    cin >> T;
    while (T--){
        int n,k;
        cin >> n >> k;
        memset(s, 0 ,sizeof s); //每個樣例s[i]都要清零
        while (n -- ){
            LL x;
            cin >> x;
            for(int i=0;x; i++,x/=k){   //列舉k進位制每一位
                s[i] += x % k;   //記錄k進位制第j位
            }
        }
        int flag = 0;
        for (int i = 0; i < N; i ++ ){
            if(s[i] > 1){
                flag = 1;
                break;
            }
        }
        if(flag) cout << "NO" << endl;
        else cout << "YES" <<endl;
    }
}
作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!