题目:
You are given an array a consisting of n integers a1, ..., an. In one operation, you can choose 2 elements ai and aj in which ai is divisible by aj and transform ai to aj.
A number x is said to be divisible by a number y if x can be divided by y and the result is an exact whole number. For example, 15 is divisible by 3, because 15÷ 3 = 5 exactly, but 9 is not divisible by 2 because 9÷ 2 is 4 with 1 left over.
Your task is to find the minimum sum of the array a that can be obtained by making as many transform operations as you want. Can you?
Input
The first line contains an integer T (1 ≤ T ≤ 100) specifying the number of test cases.
The first line of each test case contains an integer n (1 ≤ n ≤ 105), in which n is the size of array a. Then a line follows containing n integers a1, ..., an (1 ≤ ai ≤ 106), giving array a.
The sum of n overall test cases does not exceed 3 × 106.
Output
For each test case, print a single line containing the minimum sum of the array athat can be obtained after making as many transform operations as you want.
题目大意:一组数,有这种操作:如果a能被b整除,可以把a变成b,求不限制次数操作后的数组最小和。
思路:看代码即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000010;
using namespace std;
int cnt[1000010];//用来存i一共有几个
int main(){
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
ll n,x,sum=0,maxn=0;
cin>>n;
for(ll i=0; i<=1000000;i++) cnt[i]=0;//别忘了每次清0
for(ll i=1;i<=n;i++)
{
cin>>x;
cnt[x]++;
maxn=max(x,maxn);
}
for(int i=1;i<=maxn;i++)
{
if(cnt[i]>0)
{
for(ll j=2;i*j<=maxn;j++)
{
if(cnt[i*j]>0)
{
cnt[i]+=cnt[i*j];//大数变小数,i*j变成了i
cnt[i*j]=0;//大数消失
}
}
}
}
for(ll i=1;i<=maxn;i++) sum+=cnt[i]*i;
cout<<sum<<endl;
}
}