CF1419E Decryption(贪心+set维护)
题意:
给出一个正整数n,要求将它的所有不同的因子排成环,使得相邻互质的数最少,输出方案。
题解:
用set维护这个过程,贪心的做一下就好了。比赛的时候D2写歪了一直没看这题,泪目。
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+100; int t,n; int main () { scanf("%d",&t); while (t--) { scanf("%d",&n); set<int> st; st.insert(n); for (int i=2;i<=sqrt(n);i++) { if (n%i) continue; st.insert(i); st.insert(n/i); } //for (auto it=st.begin();it!=st.end();it++) printf("%d ",*it); vector<int> ans; ans.push_back(*st.begin()); st.erase(*st.begin()); int len=st.size(); for (int i=1;i<=len;i++) { set<int> ::iterator it; int f=0; for (it=st.begin();it!=st.end();it++) if (__gcd(*it,ans.back())>1) { f=1;break; } if (f) { ans.push_back(*it); st.erase(*it); } else { ans.push_back(*st.begin()); st.erase(*st.begin()); } } int cnt=0; for (int i=1;i<ans.size();i++) if (__gcd(ans[i],ans[i-1])==1) cnt++; if (__gcd(ans[0],ans.back())==1) cnt++; for (int v:ans) printf("%d ",v); printf("%d\n",cnt); printf("\n"); } }