Codeforces Round #694 (Div. 2) B. Strange List
B. Strange List
题目分析
题意:给你一个长度为n的数组和一个数字x,从第一个元素开始,如果改元素q能被x整除,那么将就在数组后面新增x个(q / x),直到遇到的元素不能被x整除,求最后数组的元素之和
让我们从样例开始入手分析:样例中的第一个情况数组a为[12],x为2,数组最终变成了[12,6,6,3,3,3,3]。我们可以发现其中的[6,6]的和为12
,[3,3,3,3]的和也为12
。
之后再看一下第二个情况,2中的数组为[4,6,8,2],x为2,之后数组内产生的新元素为[2,2,3,3,4,4,1,1,1,1,1,1],再把它们合并一下就成了[4,6,8,2,4],我们最终的答案实际上是在数组内不断循环,不断的加上每个元素,直到不满足某种情况停止循环。在第二个情况中,原数组的第一个元素4
被分成了两个2
和四个1
,相当于4被x和x2分别整除,分成了x和x2个元素。原数组内的第二个元素6
只能被x整除分成x个元素,但是不能被x^2整除,所以循环停止。
所以最终的思路为在数组里不断循环,数组元素的值不断累加,循环完成一次x自身指数加上1,当元素不能被x整除时循环停止,输出答案。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 201000;
long long a[N];
int n, t;
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
long long x;
cin >> t;
while(t--){
long long sum = 0;
cin >> n >> x;
for(int w = 0; w < n; w++){
cin >> a[w]; sum += a[w];
}
long long t = x;
for(int w = 0; w < n; w++){
if(a[w] % t == 0) sum += a[w];
else break;
if(w == n - 1) t *= x, w = -1;//因为循环结束后还会执行w++,所以让w的值等于-1
}
cout << sum << endl;
}
return 0;
}