题意:
思路:
感谢xjc学长的解答,大冬天的,放图片吧!!!太冷了
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 5e6 + 5;
int vis[maxn];
int p[maxn];
int cnt = 0;
int maxp[maxn];
vector<int>G[maxn];
vector<pii>ans;
//学会的内容
//1.pair的使用
//2.埃式筛法,筛素数
//问题是为什么要使用最大的质数因子???
void init(){
for(int i = 2;i <= 5e6;i++){
if(!vis[i]){
vis[i] = 1;
p[++cnt] = i;
maxp[i] = i;
for(int j = 2;;j++){
if(i * j > 5e6) break;
vis[i * j] = 1;
maxp[i * j] = i;
}
}
}
}
int main(){
int t;
scanf("%d",&t);
init();
while(t--){
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++) G[i].clear();
for(int i = 2;i <= n;i++) G[maxp[i]].push_back(i);
ans.clear();
for(int i = n;i >= 2;i--){
if(G[i].size() < 2) continue;
if(G[i].size() % 2 == 0){
for(int j = 0;j < G[i].size();j += 2){
ans.push_back(make_pair(G[i][j],G[i][j + 1]));
}
}
else{
if(i != 2) G[2].push_back(G[i][1]);
ans.push_back(make_pair(G[i][0],G[i][2]));
for(int j = 3;j < G[i].size();j += 2){
ans.push_back(make_pair(G[i][j],G[i][j + 1]));
}
}
}
printf("%d",ans.size());
if(ans.size() == 0) printf("\n");
else printf(" ");
for(int i = 0;i < ans.size();i++){
printf("%d %d",ans[i].first,ans[i].second);
if(i != ans.size() - 1) printf(" ");
else printf("\n");
}
}
return 0;
}