1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <map> #include <string> using namespace std;
int gcd(int a, int b) { return b==0? a : gcd(b,a%b); }
int arr[1000]; map<int,int> mp,ms; map<int,int>::iterator it; int n; int main() { int T; int cnt; scanf("%d",&T); while (T--) { int cnt=0,g; scanf("%d",&n); for (int i = 0 ; i < n ; i++) { scanf("%d",&arr[i]); if (i==0) g= arr[i]; else g = gcd(g,arr[i]); } if (n==3) { mp.clear(); mp[gcd(arr[0],arr[1])]++; mp[gcd(arr[1],arr[2])]++; mp[gcd(arr[2],arr[0])]++; for (it = mp.begin();it != mp.end() ; it ++) { if (it->second) { if (it==mp.begin()) printf("%d",*it); else printf(" %d",*it); } } putchar('\n'); } else { mp.clear(); ms.clear(); mp[gcd(arr[0],arr[1])]++; for (int i = 2 ; i < n ; i ++) { ms.clear(); for (it = mp.begin() ; it != mp.end() ; it ++) { ms[gcd(it->first,arr[i])]++; } for (int j = 0 ; j < i ; j ++) mp[gcd(arr[i],arr[j])]++; for (it = ms.begin() ; it != ms.end() ; it ++) { mp[it->first]++; } } mp[g]--; bool first = true; for (it = mp.begin();it != mp.end() ; it ++) { if (it->second) { if (first) { printf("%d",it->first); first = false; } else printf(" %d",it->first); } } putchar('\n');
} }
}
|