sakiko要構造一個長度為?nnn?的排列?ppp?,使得每一個?pi+i?(1≤i≤n)p_i+i\ (1\leq i\leq n)pi?+i?(1≤i≤n)?都是質數。
排列的定義為:長度為?nnn?的數組,其中?1?n1-n1?n?每個數字在數組中各出現一次。
輸入描述:
第一行輸入一個整數 n(1≤n≤106)n(1 \leq n \leq 10^6)n(1≤n≤106) 表示數組長度。
輸出描述:
輸出 nnn 個整數表示答案,如果有多種解法,則輸出任意一種。若無解則輸出 -1。
示例1
輸入
3
輸出
1 3 2
切比雪夫定理:對于一個大于1的正整數,在(a,2a]內總有一個素數
思路:在序列1.2.3...n中,對于任意一個子序列,若能使其第一個數和最后一個數相加等于一個素數,那么這一段的構造為:從最后一個數倒著把他們放入構造數組中。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int prime[N];
bool isprime[N];
int cnt=0;
void eular(int n)//歐拉篩法篩出所有素數
{memset(isprime,true,sizeof(isprime));isprime[1]=false;for(int i=2;i<=n;i++){if(isprime[i])prime[cnt++]=i;for(int j=0;prime[j]*i<=n&&j<=cnt;j++){isprime[i*prime[j]]=false;if(i%prime[j]==0)break;}}
}
int main()
{int n;cin>>n;eular(2*n);//歐拉篩int i=n;int a[n+1];while(i>=1){int minp=i+1;while(!isprime[minp])minp++;//找到大于n的第一個素數int mini=minp-i;for(int j=mini;j<=i;j++){a[j]=minp-j;}//存入數組i=mini-1;//處理前面未處理的部分}for(int i=1;i<=n;i++)cout<<a[i]<<" ";//輸出
}