对于一个整数区间都可以用n个素数区间组成,n <= 4
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#define MOD ((int)(1e9) + 7)
#define eps 1e-10
#define maxn 100010
using namespace std;
typedef long long ll;
int a[maxn], pos[maxn], p[maxn];
bool ok[maxn];
int prime() {
ok[0] = ok[1] = true;
for (int i = 2; i*i < maxn; ++ i) if (!ok[i])
{
for (int j = i+i; j < maxn; j+=i) {
if (!ok[j]) ok[j] = true;
}
}
int m = 0;
for (int i = 0; i < maxn; ++ i) if (!ok[i]) {
p[m++] = i;
}
return m;
}
vector<pair<int, int> > v;
int main() {
int n, m;
m = prime();
while (scanf("%d", &n) != EOF) {
v.clear();
for (int i = 1; i <= n; ++ i) {
scanf("%d", &a[i]);
pos[a[i]] = i;
}
for (int i = 1; i <= n; ++ i) if (a[i] != i) {
int j = pos[i];
while (i != j) {
int num = j - i + 1;
int pri = p[upper_bound(p, p+m, num) - p - 1];
num = j - pri + 1;
v.push_back(make_pair(num, j));
pos[a[j]] = num;
pos[a[num]] = j;
swap(a[j], a[num]);
j = num;
}
}
cout << v.size() << endl;
for (int i = 0; i < v.size(); ++ i) {
cout << v[i].first << " " << v[i].second << endl;
}
}
}