给定一个初始长度为 nn 的数组 aa 以及一个整数 xx。
我们现在要对数组 aa 进行延伸,具体方法如下:
我们从数组中的第一个元素开始,逐个遍历数组中的每个元素。
当遍历到数组中的元素 qq 时,如果 qq 能够被 xx 整除,则在数组的末尾添加 xx 个整数 qxqx,并开始遍历下一个元素。
否则,停止遍历,数组延伸结束。
注意,后面新增的元素也要被考虑在内,加以处理和判断。
请计算,在数组延伸结束后,数组中所有元素的和。
输入格式
第一行包含整数 TT,表示共有 TT 组测试数据。
每组数据的第一行包含两个整数 nn 和 xx。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。
输出格式
每组数据输出一行,一个结果,表示延伸结束后,数组中所有元素的和。
数据范围
1≤T≤1001≤T≤100,
1≤n≤1051≤n≤105,
2≤x≤1092≤x≤109,
1≤ai≤1091≤ai≤109,
输入保证,所有 TT 个 nn 的和不超过 105105。
输入样例:
2
1 2
12
4 2
4 6 8 2
输出样例:
36
44
样例解释
第一组数据,最终数组为 [12,6,6,3,3,3,3][12,6,6,3,3,3,3]。
第二组数据,最终数组为 [4,6,8,2,2,2,3,3,4,4,1,1,1,1,1,1][4,6,8,2,2,2,3,3,4,4,1,1,1,1,1,1]。
题意,
整除后所有的和都等于前几个初始值和相同,
当不能被整除的时候就不整除,
先把能整除的加起来
和不能整除的加起来;
看代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int n, x;
int a[100005];
int main()
{
int T;
scanf("%d", &T);
while (T -- )
{
scanf("%d%d", &n, &x);
for (int i = 0; i < n; i ++ )
scanf("%d", &a[i]);
LL sum = 0, patsum = 0;
int cnt = 100005;
for (int i = 0; i < n; i ++ )
{
sum += a[i];
int c = 0;
int k = a[i];
while( k % x == 0)
{
c ++ ;
k /= x;
}
if (c < cnt)
{
cnt = c;
patsum = sum - a[i];
}
}
printf("%lld\n", sum * (cnt + 1) + patsum);
}
return 0;
}