题解 P4226 【避难所】
对于
对于
显然存在一个
如果贪心的话,会第一步选出
如果
暴力的时候从大到小枚举会快很多。
#include<bits/stdc++.h>
using namespace std;
#define I inline int
#define V inline void
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
const int N=2e6+1;
int T,n=N-1,m,p;
int tag[N],pri[N],pre[N],nxt[N];
I count(int x){
if(x==1)return 1;
ROF(i,n-1,1)if(x%i==0)
return count(x/i)+1;
}
V force(){
ROF(i,n-1,1)ROF(j,n-1,i)ROF(k,n-1,j)
if(count(i*j*k)>4)
return void(cout<<3<<' '<<i<<' '<<j<<' '<<k<<'\n');
puts("-1");
}
V cheat(){
int x=floor(cbrt(n)),y=ceil(sqrt(n)),z=pre[x]*nxt[y];
cout<<3<<' '<<z<<' '<<z<<' '<<z<<'\n';
}
int main(){
FOR(i,2,n){
if(!tag[i])pri[++m]=i;
FOR(j,1,m){
if((p=i*pri[j])>n)break;
tag[p]=1;
if(i%pri[j]==0)break;
}
}
FOR(i,1,n)pre[i]=pre[i-1],(!tag[i])&&(pre[i]=i);
ROF(i,n,1)nxt[i]=nxt[i+1],(!tag[i])&&(nxt[i]=i);
for(scanf("%d",&T);T--;){
scanf("%d",&n);
if(n<=150)force();
else cheat();
}
}