CodeForces - 1312C. Adding Powers 思维+进制转换

CodeForces - 1312C. Adding Powers

原题地址:

http://codeforces.com/contest/1312/problem/C

基本题意:

给你一个n个元素的数组a和一个数k,问你能否将一个开始全为零的数组每次加k ^ i,使得这个数组变为数组a,每个 i 最多使用一次,即不能多次使用一个 i 。

基本思路:

这题本质上就是一个进制装换,我们把数组a中的每个数转换为k进制,因为每个i最多使用一次,所以枚举每个位,每个位的和不大于1即可以否则就不行。

参考代码:

#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f

const int maxn = 35;
int n,k,a[maxn];
int memo[maxn][64];
void judge(int pos,int m){
    int x = a[pos];
    int top = 0;
    while (x > 0){
        memo[pos][top++] = x % k;
        x /= m;
    }
}
signed main() {
    IO;
    int t;
    cin >> t;
    while (t-- > 0) {
        cin >> n >> k;
        memset(memo,0, sizeof(memo));
        for (int i = 0; i < n; i++) cin >> a[i];
        for (int i = 0; i < n; i++) {
            judge(i, k);
        }
        bool v = true;
        for (int i = 63; i >= 0; i--) {
            int sum = 0;
            for (int j = 0; j < n; j++) {
                sum += memo[j][i];
            }
            if (sum > 1) v = false;
        }
        if (v) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

发布了23 篇原创文章 · 获赞 7 · 访问量 1745

猜你喜欢

转载自blog.csdn.net/weixin_44164153/article/details/104794537
今日推荐