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;
}