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");
    }
}

 

posted @ 2020-09-24 13:04  zlc0405  阅读(199)  评论(0编辑  收藏  举报