Minimum Sum of Array(map迭代器)

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 a that can be obtained after making as many transform operations as you want.

Example
Input
1
5
2 2 3 6 6
Output
11


 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<map>
 5 #define LL long long int
 6 using namespace std;
 7 int main()
 8 {
 9     int t,flag,flag1;
10     LL i,j,a,n,k;
11     LL ans,x;
12     map<LL,LL>mp;
13     map<LL,LL>::iterator it;
14     scanf("%d",&t);
15     while(t--)
16     {
17         mp.clear();
18         scanf("%lld",&n);
19         for(i=0;i<n;i++)
20         {
21             scanf("%lld",&a);
22             mp[a]++;
23         }
24         flag=0;
25         ans=0;
26         for(it=mp.begin();it!=mp.end();it++)
27         {
28             k=it->first;
29             if(k==1)///出现1
30             {
31                 flag=1;
32                 break;
33             }
34             flag1=0;
35             x=0;
36             for(i=2;i*i<=k;i++)
37             {
38                 if(k%i==0)
39                 {
40                     if(mp.count(i))
41                     {
42                         mp[i]+=mp[k];
43                         it--;
44                         mp.erase(k);
45                         flag1=1;
46                         break;
47                     }
48                     else if(mp.count(k/i))
49                     {
50                         x=k/i;
51                     }
52                 }
53             }
54             if(!flag1)
55             {
56                 if(x)
57                 {
58                     mp[x]+=mp[k];
59                     it--;
60                     mp.erase(k);
61                 }
62             }
63         }
64         if(flag)
65         {
66             printf("%lld\n",n);
67         }
68         else
69         {
70             for(it=mp.begin();it!=mp.end();it++)
71             {
72                 ans+=it->second*it->first;
73             }
74             printf("%lld\n",ans);
75         }
76     }
77     return 0;
78 }

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9387634.html