codeforces2090D(对于某一排列不断延长求平均数的不变性)

Problem - D - Codeforces

解题思路:

利用平均数特性

\[ p =\lceil \frac{p+(p-1)}{2} \rceil=\lceil \frac{p+(p-1)+(p+1)}{3} \rceil(p>1) \]

这样我们就只需要从\(n\)中间往两边找最近的质数\(p\)即可,然后用来回震荡的方式将排列存入数组然后输出即可

代码:


#include<bits/stdc++.h>
using namespace std;
vector<int>pr(200005);
void solve(){
	int n;
	cin>>n;
	int t=n/2;
	vector<int>ans;
	for(int i=0;;i++){
		if(pr[i+t]==0){
			ans.push_back(i+t);
			for(int j=1;j<=n;j++){
				if(i+t-j>0){
					ans.push_back(i+t-j);
				}
				if(i+t+j<=n){
					ans.push_back(i+t+j);
				}
			}
			break;
		}
		if(pr[t-i]==0){
			ans.push_back(t-i);
			for(int j=1;j<=n;j++){
				if(t-i-j>0){
					ans.push_back(t-i-j);
				}
				if(t-i+j<=n){
					ans.push_back(-i+t+j);
				}
			}
			break;
		}
	}
	for(int i=0;i<n;i++){
		cout<<ans[i]<<' ';
	}
	cout<<endl;
}
 
signed main() {
    ios::sync_with_stdio(0);
    cout.tie(0),cin.tie(0);
    int test=1;
    for(int i=2;i*i<=200000;i++){
    	for(int j=i*i;j<=200000;j+=i){
    		pr[j]=1;
		}
	}
	pr[1]=1;
    cin>>test;
    while(test--)
    solve();
    return 0;
}int
posted @ 2025-04-01 16:11  C微  阅读(9)  评论(0)    收藏  举报