Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///#include <stdio.h>
- ///#include <iostream>
- ///#include <cstring>
- ///#include <cmath>
- ///#include <algorithm>
- ///#include <string>
- ///#include <vector>
- ///#include <map>
- ///#include <set>
- ///#include <queue>
- ///#include <cstdlib>
- ///#include <limits>
- ///#include <iostream>
- ///#include <sstream>
- ///#include <unordered_set>
- ///#include <unordered_map>
- ///#include <random>
- #include <bits/stdc++.h>
- ///#include <ext/pb_ds/assoc_container.hpp>
- ///#include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- ///using namespace __gnu_pbds;
- #define MAX 100005
- #define EPS 1e-9
- #define ull unsigned long long
- #define ll long long
- #define inf INT_MAX
- #define pi acos(-1.0)
- #define vi vector<int>
- #define vl vector<long long>
- #define pii pair<int,int>
- #define pll pair<long long,long long>
- #define mp make_pair
- #define mem(a, v) memset(a, v, sizeof (a))
- #define mod 1000000007
- #define all(a) a.begin(),a.end()
- #define rall(a) a.rbegin(),a.rend()
- #define ff first
- #define ss second
- #define arsort(ar,n) sort(ar,ar+n);
- #define vsort(v) sort(v.begin(),v.end())
- #define vrev(v) reverse(v.begin(),v.end())
- #define arrev(ar,n) reverse(ar,ar+n)
- #define pb push_back
- #define popb pop_back
- #define booster() ios_base::sync_with_stdio(0); cin.tie(0);
- #define read(f) freopen(f, "r", stdin)
- #define scani(x) scanf("%d",&x)
- #define scanl(x) scanf("%lld",&x)
- #define scand(x) scanf("%lf",&x)
- #define scans(x) scanf("%s",x)
- #define min3(a,b,c) min(a,min(b,c))
- #define max3(a,b,c) max(a,max(b,c))
- #define min4(a,b,c,d) min(min(a,b),min(c,d))
- #define max4(a,b,c,d) max(max(a,b),max(c,d))
- #define max5(a,b,c,d,e) max(max3(a,b,c),max(d,e))
- #define min5(a,b,c,d,e) min(min3(a,b,c),min(d,e))
- #define bitCheck(a,k) ((bool)(a&(1<<(k))))
- #define bitOff(a,k) (a&(~(1<<(k))))
- #define bitOn(a,k) (a|(1<<(k)))
- #define bitFlip(a,k) (a^(1<<(k)))
- #define POPCOUNT __builtin_popcount
- #define POPCOUNTLL __builtin_popcountll
- #define RIGHTMOST __builtin_ctzll
- #define LEFTMOST(x) (63-__builtin_clzll((x)))
- #define scani2(a,b) scani(a) , scani(b)
- #define scani3(a,b,c) scani(a), scani(b), scani(c)
- #define scani4(a,b,c,d) scani(a), scani(b), scani(c), scani(d)
- #define scani5(a,b,c,d,e) scani(a), scani(b), scani(c), scani(d) , scani(e)
- ///typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;///*X.find_by_order();X.order_of_key();
- template <class T> inline bool isLeap(T y) {return (y % 400 == 0) || (y % 100 ? y % 4 == 0 : false); }
- template< class T > inline T gcd(T a, T b) { return (b) == 0 ? (a) : gcd((b), ((a) % (b))); }
- template< class T > inline T lcm(T a, T b) { return ((a) / gcd((a), (b)) * (b)); }
- template <class T> inline T BigMod(T Base,T power,T M=mod){if(power==0)return 1;if(power&1)return ((Base%M)*(BigMod(Base,power-1,M)%M))%M;else{T y=BigMod(Base,power/2,M)%M;return (y*y)%M;}}
- template <class T> inline T ModInv (T A,T M = mod){return BigMod(A,M-2,M);}
- int fx[] = {-1,+0,+1,+0,+1,+1,-1,-1,+0};
- int fy[] = {+0,-1,+0,+1,+1,-1,+1,-1,+0};
- int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- const int MAXN1 = 50000;
- const int MAXN2 = 50000;
- const int MAXM = 150000;
- int n1, n2, edges, last[MAXN1], prv[MAXM], head[MAXM];
- int matching[MAXN2], dist[MAXN1], Q[MAXN1];
- bool used[MAXN1], vis[MAXN1];
- void init(int _n1, int _n2) {
- n1 = _n1;
- n2 = _n2;
- edges = 0;
- fill(last, last + n1, -1);
- }
- void addEdge(int u, int v) {
- head[edges] = v;
- prv[edges] = last[u];
- last[u] = edges++;
- }
- void bfs() {
- fill(dist, dist + n1, -1);
- int sizeQ = 0;
- for (int u = 0; u < n1; ++u) {
- if (!used[u]) {
- Q[sizeQ++] = u;
- dist[u] = 0;
- }
- }
- for (int i = 0; i < sizeQ; i++) {
- int u1 = Q[i];
- for (int e = last[u1]; e >= 0; e = prv[e]) {
- int u2 = matching[head[e]];
- if (u2 >= 0 && dist[u2] < 0) {
- dist[u2] = dist[u1] + 1;
- Q[sizeQ++] = u2;
- }
- }
- }
- }
- bool dfs(int u1) {
- vis[u1] = true;
- for (int e = last[u1]; e >= 0; e = prv[e]) {
- int v = head[e];
- int u2 = matching[v];
- if (u2 < 0 || !vis[u2] && dist[u2] == dist[u1] + 1 && dfs(u2)) {
- matching[v] = u1;
- used[u1] = true;
- return true;
- }
- }
- return false;
- }
- int maxMatching() {
- fill(used, used + n1, false);
- fill(matching, matching + n2, -1);
- for (int res = 0;;) {
- bfs();
- fill(vis, vis + n1, false);
- int f = 0;
- for (int u = 0; u < n1; ++u)
- if (!used[u] && dfs(u))
- ++f;
- if (!f)
- return res;
- res += f;
- }
- }
- int arr1[200],arr2[200];
- /*********************** let the play begin() ***********************************/
- int main()
- {
- booster()
- /// read("input.txt");
- int t;
- scani(t);
- int ajinka=1;
- while(t--)
- {
- init(500, 500);
- int n,m;
- scani(n);
- int arr[n+5];
- for(int i=0;i<n;i++)scani(arr[i]);
- sort(arr,arr+n);
- int x=unique(arr,arr+n)-arr;
- for(int i=0;i<x;i++)for(int j=i+1;j<x;j++)if(arr[j]%arr[i]==0)addEdge(i,j);
- int mis=x-maxMatching();int prr[n+5];vi ans;mem(prr,0);
- for(int i=0;i<x;i++)
- {
- if(prr[i])continue;
- vi pk;
- pk.pb(arr[i]);
- for(int j=i+1;j<x;j++)
- {
- if(prr[j]==0&&arr[j]%arr[i]!=0) pk.pb(arr[j]);
- }
- init(300,300);
- int mnt = 0;
- for(int j=0;j<pk.size();j++)for(int k=j+1;k<pk.size();k++)if(pk[k]%pk[j]==0)addEdge(j,k);
- int gg = ans.size() + pk.size() - maxMatching();
- ///cout<<gg<<" "<<arr[i]<<endl;
- if (gg == mis)
- {
- ans.pb(arr[i]);
- for(int j=i+1;j<x;j++)if(arr[j]%arr[i]==0)prr[j]=1;
- }
- }
- printf("Case %d: ",ajinka++);
- for(int j=0;j<ans.size();j++)
- {
- printf("%d",ans[j]);
- if(j<ans.size()-1)printf(" ");
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement