CF-Round 83-Div. 2-C题
C. Adding Powers
题目大意:就是给你一个序列。给你一个数k,有两个操作。第一你可以选择不操作。第二你可以加上k^i次方。只不过每个i只能用一次。问你是否可以构造出所给的序列。
我们很容易知道如果一个序列全为0,那么直接跳过就行。一定可以构造出来。
这道题的思路很明显把。。把序列中的每个数转化成k进制。这个跟2进制差不多嘛。然后就是看看有没有需要两次或者两次以上的i(指数),或者说乘了这个运算,还需要乘以其他常数才可以得到那个数字的都不能构造出来。
转换成式子就是序列中的每个数转换成k进制之后只包含0和1,并且每个数转化出来的k进制包含1的位置的个数不能超过一个。那个这个就是可以构造出来的序列。。
代码很简单~
我卡在ll那个很久。。服了。。。=-=
还需要多加努力噢~
代码部分:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
ll temp;
int a[105] = {0};
int flag = 0;
for (int i = 0; i < n; i++)
{
cin >> temp;
int cnt = 0;
while (temp)
{
a[cnt] += temp % k;
temp /= k;
if (a[cnt] > 1)
{
flag = 1;
}
cnt++;
}
}
flag ? cout << "NO\n" : cout << "YES\n";
}
return 0;
}