首页 > 技术文章 > Codeforces Round #694 (Div. 2) B. Strange List

FrankOu 2021-01-06 08:04 原文

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

推荐阅读