标签:main 编号 while math put 重复 ems cpp mat
给定一个长为 \(n\) 且初始值为 \(0\) 的序列 \(v\) 和一个长度为 \(n\) 的序列 \(a\) 。
给定 \(k\) ,每次操作,要么将一个 \(v[pos]\) 增大 \(k^{step}\),要么跳过当前操作, \(step\) 从 \(0\) 开始计数,每一回合结束 \(step\) 自增。
是否可以使得 \(v\) 变成 \(a\) ?
考虑转化为 \(k\) 进制求解。
对于每一个 \(a[i]\) ,其 \(k\) 进制表示下的每一个 \(digit\) 必须为 \(1\) ,同时,将所有的 \(a[i]\) 拆位,数位编号必须没有重复。
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;
}
标签:main 编号 while math put 重复 ems cpp mat
原文地址:https://www.cnblogs.com/ChenyangXu/p/12453095.html