牛客(多校4):Harder Gcd Problem

在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e5+10;
struct node{
    int ans1,ans2;
    node(){}
    node(int a1,int a2){
        ans1=a1,ans2=a2;
    }
};
int a[MAXN];
bool pr[MAXN],vis[MAXN];
vector<node> ans;
int main()
{
    for(int i=2;i<MAXN;i++)
        if(!pr[i]) for(int j=i*2;j<MAXN;j+=i) pr[j]=1;
    int t,n,num;
    for(scanf("%d",&t);t--;){
        scanf("%d",&n);memset(vis,0,sizeof(vis));ans.clear();
        for(int i=n;i>=2;i--){
            if(pr[i]) continue;num=0;
            for(int j=i;j<=n;j+=i) if(!vis[j]) a[++num]=j;
            if(num<=1) continue;
            if(num&1){
                ans.push_back(node(a[1],a[3]));
                vis[a[1]]=vis[a[3]]=1;
                for(int j=4;j<=num;j+=2) ans.push_back(node(a[j],a[j+1])),
                                        vis[a[j]]=vis[a[j+1]]=1;
            }
            else for(int j=1;j<=num;j+=2) ans.push_back(node(a[j],a[j+1])),
                                        vis[a[j]]=vis[a[j+1]]=1;
        }
        printf("%d\n",ans.size());
        for(int i=0;i<ans.size();i++) printf("%d %d\n",ans[i].ans1,ans[i].ans2);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107478282