zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    C语言指针和数组
    C语言malloc、calloc函数
    33、二叉树的后序遍历序列
    进程、线程、协程
    8、字符串转整数
    51、数组中的逆序对
    49、丑数
    19、正则表达式匹配
    32、从上到下打印二叉树
    leetcode5:最长回文子串
  • 原文地址:https://www.cnblogs.com/FrankOu/p/14238949.html
Copyright © 2011-2022 走看看