哥德巴赫猜想:
任一大于2的偶数,都可表示成两个素数之和。
任一大于5的整数都可写成三个质数之和。
贪心取尽可能大的素数.....
C. Prime Swaps time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard outputYou have an array a[1], a[2], ..., a[n], containing distinct integers from 1 to n. Your task is to sort this array in increasing order with the following operation (you may need to apply it multiple times):
choose two indexes, i and j (1 ≤ i < j ≤ n; (j - i + 1) is a prime number); swap the elements on positions i and j; in other words, you are allowed to apply the following sequence of assignments: tmp = a[i], a[i] = a[j], a[j] = tmp (tmp is a temporary variable).You do not need to minimize the number of used operations. However, you need to make sure that there are at most 5n operations.
InputThe first line contains integer n (1 ≤ n ≤ 105). The next line contains n distinct integers a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ n).
OutputIn the first line, print integer k (0 ≤ k ≤ 5n) — the number of used operations. Next, print the operations. Each operation must be printed as "i j" (1 ≤ i < j ≤ n; (j - i + 1) is a prime).
If there are multiple answers, you can print any of them.
Sample test(s) input 3 3 2 1 output 1 1 3 input 2 1 2 output 0 input 4 4 2 3 1 output 3 2 4 1 2 2 4 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=100100; bool vis[maxn]; int prime[maxn/10],pn; int n,a[maxn],b[maxn]; int Left[maxn*5],Right[maxn*5],nu; void get_prime() { for(int i=2;i*i<maxn;i++) { for(int j=i*2;j<maxn;j+=i) { vis[j]=1; } } for(int i=2;i<maxn;i++) { if(vis[i]==0) prime[pn++]=i; } } int Bin(int x) { int low=0,high=pn-1,mid,ans=-1; while(low<=high) { mid=(low+high)/2; if(prime[mid]<=x) { ans=prime[mid],low=mid+1; } else high=mid-1; } return ans; } void debug() { cout<<"a....\n"; for(int i=1;i<=n;i++) cout<<a[i]<<","; cout<<endl; cout<<"b....\n"; for(int i=1;i<=n;i++) cout<<b[i]<<","; cout<<endl; } int main() { get_prime(); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",a+i); b[a[i]]=i; } for(int i=1;i<=n;i++) { /// from b[i] to i greedy!!! int len=b[i]-i+1; while(len!=1) { int bin=Bin(len); int cp=b[i]-bin+1; /// changepos Left[nu]=cp,Right[nu]=b[i]; nu++; int t1=b[i],t2=b[a[cp]]; swap(a[cp],a[b[i]]); b[a[b[i]]]=t1;b[i]=t2; // debug(); getchar(); len=b[i]-i+1; } } printf("%d\n",nu); for(int i=0;i<nu;i++) { printf("%d %d\n",Left[i],Right[i]); } return 0; }版权声明:来自: 代码代码猿猿AC路 http://blog.csdn.net/ck_boss
转载于:https://www.cnblogs.com/bhlsheji/p/4900872.html
相关资源:数据结构—成绩单生成器