牛客多校2020第三场

H题——(质因子+贪心)

自己看得题解得做法,自己想不出来,队友乱搞,就过了。
倒着枚举质因子,可以出现p,2p,3p,4p····,我们可以观察出
偶数情况:质因子p,可以两两组合,最大化利用

奇数情况:把2p提取出来,其他两两组合

所有奇数情况,提取出来的一个2p1,2p2 ····,枚举到最后一个质因子2,就可以把所有没用的2p全用上
题目链接

//#pragma GCC optimize(2)
//#pragma GCC target ("sse4")
#include
//typedef long long ll;
#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<
#define eps         1e-6
#define base        131
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define ferma(a,b)  pow(a,b-2)
#define mod(x)      (x%mod+mod)%mod
#define pb          push_back
#define decimal(x)  cout << fixed << setprecision(x);
#define all(x)      x.begin(),x.end()
#define rall(x)      x.rbegin(),x.rend()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
template<typename T> inline T fetch(){T ret;cin >> ret;return ret;}
template<typename T> inline vector<T> fetch_vec(int sz){vector<T> ret(sz);for(auto& it: ret)cin >> it;return ret;}
template<typename T> inline void makeUnique(vector<T>& v){sort(v.begin(), v.end());v.erase(unique(v.begin(), v.end()), v.end());}
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("D:/LSNU/codeforces/duipai/data.txt","r",stdin);
    //  freopen("D:/LSNU/codeforces/duipai/WA.txt","w",stdout);
#endif
}
const int N=2e5+5;
int prime[N],vis[N];
signed main()
{
    IOS;
    file();
    for(int i=2;i<=N;i++)
    {
        if(prime[i])
            continue;
        for(int j=i*2;j<=N;j+=i)
            prime[j]=true;
    }
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            vis[i]=0;
        vector<pair<int,int> >ans;
        for(int i=n/2;i>=2;i--)
        {
            if(prime[i])
                continue;
            vector<int>vec;
            int cnt=0;
            for(int j=i;j<=n;j+=i)
            {
                if(vis[j])
                    continue;
                vec.pb(j);
                cnt++;
            }
            if(cnt==1)
                continue;
            if(cnt%2)
            {
                ans.pb({vec[0],vec[2]});
                vis[vec[0]]=true;
                vis[vec[2]]=true;
                for(int i=3;i<cnt;i+=2)
                {
                    ans.pb({vec[i],vec[i+1]});
                    vis[vec[i]]=true;
                    vis[vec[i+1]]=true;
                }
            }
            else
            {
                for(int i=0;i<cnt;i+=2)
                {
                    ans.pb({vec[i],vec[i+1]});
                    vis[vec[i]]=true;
                    vis[vec[i+1]]=true;
                }
            }
        }
        cout<<ans.size()<<endl;
        for(auto it:ans)
            cout<<it.F<<" "<<it.S<<endl;
    }



    return 0;
}

你可能感兴趣的:(比赛)