$CF\ EDU\ 83$

\(CF\ EDU\ 83\)

\(C\)

题意

给定一个长为 \(n\) 且初始值为 \(0\) 的序列 \(v\) 和一个长度为 \(n\) 的序列 \(a\)
给定 \(k\) ,每次操作,要么将一个 \(v[pos]\) 增大 \(k^{step}\),要么跳过当前操作, \(step\)\(0\) 开始计数,每一回合结束 \(step\) 自增。
是否可以使得 \(v\) 变成 \(a\)

题解

考虑转化为 \(k\) 进制求解。
对于每一个 \(a[i]\) ,其 \(k\) 进制表示下的每一个 \(digit\) 必须为 \(1\) ,同时,将所有的 \(a[i]\) 拆位,数位编号必须没有重复。

\(code\)

int t, n, k;
int b[100];

bool check(LL x)
{
    int i = 0;//digit 编号
    while(x) {
        if(x % k == 1 && b[i]) return 0;
        if(x % k > 1) return 0;
        if(x % k == 1) b[i] = 1;
        x /= k;
        i++;
    }
    return 1;
}
int main()
{
    scanf("%d", &t);
    while(t--){
        memset(b, 0, sizeof(b));
        scanf("%d %d", &n, &k);
        int f = 0;
        LL x; 
        for(int i = 1; i <= n; ++i){
            scanf("%lld", &x);
            if(!check(x)) f = 1;
        }
        if(f) puts("NO");
        else puts("YES");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ChenyangXu/p/12453095.html
83
今日推荐