codeforces2090D(对于某一排列不断延长求平均数的不变性)
解题思路:
利用平均数特性
\[ 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