https://codeforces.com/contest/1471/problem/B
题意:给你一个数组和x,你的初始分数为0。从头开始遍历数组,对于当前的元素,不能整除x时就结束,输出分数;可以整除x就将分数增加当前数字大小,并且在数组末尾添加x个大小为a[i]除以x的元素。
如果按照题意来模拟数组肯定会爆掉…其实我们不需要不断更新数组a,我们可以用一个数组b来记录当前大小为a[i]的元素有b[i]个。这样如果a[i]能整除 x的话就更新a[i]为a[i]/x,b[i]=b[i]*x。
这里要注意初始的分数其实是给你的数组元素和,b[i]初始为1,初始化完成之后才会进入真正的操作~
#include <bits/stdc++.h>
using namespace std;
#define qc std::ios::sync_with_stdio(0);
int a[100001];
int b[100001];
int main() {
qc;
cin.tie(0);
int t;
cin >> t;
while (t--) {
int n, k;
long long ans = 0;
cin >> n >> k;
for (int i = 0; i < n; i++) {
cin >> a[i];
b[i] = 1;
ans += a[i];
}
int flag = 0;
while (1) {
for (int i = 0; i < n; i++) {
if (a[i] % k != 0) {
flag = 1;
break;
} else {
a[i] = a[i] / k;
b[i] = b[i] * k;
ans += b[i] * a[i];
}
}
if (flag == 1)
break;
}
cout << ans << endl;
}
}