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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM