Codeforces Round 884 (Div. 1 + Div. 2) B. Permutations & Primes

发布时间 2023-07-12 23:56:05作者: 突破铁皮

题目大意求出一个n的排列,使得对于所有的长度的子区间其中不包含在该子区间中最小正整数为质数,这样的区间数最多

对于任意长度的区间,如果1不包含,则这样的区间一定是bad的,因此我们想要1尽可能在区间中则1放中间,此外,2和3是除1外的最小正整数也是质数,如果2和3不包含在区间则该区间一定是good的,所以我们把2和3放两端即可

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <utility>
#include <vector>
#include <queue>
#include <map>
using namespace std;
const int N=2e5+10;
int n,t;
void solve(){
	cin>>n;
	if(n==1){
		puts("1");
	}
	else if(n==2){
		puts("2 1");
	}
	else if(n==3){
		puts("2 1 3");
	}
	else{
		cout<<2<<" ";
		for(int i=4;i<=n;i++){
			if(i==(4+n+1)/2) cout<<1<<" ";
			else cout<<i<<" ";
		}
		if((4+n+1)/2>3)
		cout<<((4+n+1)/2)<<" ";
		cout<<3<<endl;
	}
}
int main(){
	ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>t;
    while(t--){
    solve();
}
}