Every person likes prime numbers. Alice is a person, thus she also shares the love for them. Bob wanted to give her an affectionate gift but couldn't think of anything inventive. Hence, he will be giving her a graph. How original, Bob! Alice will surely be thrilled!

When building the graph, he needs four conditions to be satisfied:

It must be a simple undirected graph, i.e. without multiple (parallel) edges and self-loops.

The number of vertices must be exactly n — a number he selected. This number is not necessarily prime.

The total number of edges must be prime.

The degree (i.e. the number of edges connected to the vertex) of each vertex must be prime.

Below is an example for n=4. The first graph (left one) is invalid as the degree of vertex 2 (and 4) equals to 1, which is not prime. The second graph (middle one) is invalid as the total number of edges is 4, which is not a prime number. The third graph (right one) is a valid answer for n=4.

Note that the graph can be disconnected.

Please help Bob to find any such graph!

Input

The input consists of a single integer n (3≤n≤1000) — the number of vertices.

Output

If there is no graph satisfying the conditions, print a single line containing the integer −1.

Otherwise, first print a line containing a prime number m (2≤m≤n(n−1)2) — the number of edges in the graph. Then, print m lines, the i-th of which containing two integers ui, vi (1≤ui,vi≤n) — meaning that there is an edge between vertices ui and vi. The degree of each vertex must be prime. There must be no multiple (parallel) edges or self-loops.

If there are multiple solutions, you may print any of them.

Note that the graph can be disconnected.

Examples

Input

4

Output

5

1 2

1 3

2 3

2 4

3 4

Input

8

Output

13

1 2

1 3

2 3

1 4

2 4

1 5

2 5

1 6

2 6

1 7

1 8

5 8

7 8

Note

The first example was described in the statement.

In the second example, the degrees of vertices are [7,5,2,2,3,2,2,3]. Each of these numbers is prime. Additionally, the number of edges, 13, is also a prime number, hence both conditions are satisfied.

题意:

让你构造一个n个接点的图,使其边的总个数是质数,每一个节点的度数也是质数。

思路:

利用一个性质 n~n+n/2 这个区间里,必定有一个数是质数。

那么我们可以先把图连成一个圆环,现在边的个数是n。

如果当前边的个数不是质数,那么从1开始,在圆环中加入1与它在圆环中的对面节点1+n/2 连接而成的边。

还不是质数就加入2与对面节点的边,这样可以最多加到 n+n/2个边,根据上面的性质我们可以知道,这个过程中必有边数sum是质数的。

有因为这个过程中每一个节点的度数是2或者3. 所以整体是满足条件的。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
// const int maxn = 1e7+50;
bool noprime[maxn + 50];
vector <int> p;
void getPrime()
{
// 华丽的初始化
memset(noprime, false, sizeof(noprime));
p.clear(); int m = (int)sqrt(maxn + 0.5);
// 优化的埃筛
for (int i = 2; i <= m; i++)
{
if (!noprime[i])
{
for (int j = i * i; j <= maxn; j += i)
{
noprime[j] = true;
}
}
} }
std::vector<pii> v; int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\code_stream\\out.txt","w",stdout);
getPrime();
int n;
gbtb;
cin >> n;
if (!noprime[n])
{
cout << n << endl;
repd(i, 2, n)
{
cout << i << " " << i - 1 << endl;
}
cout << 1 << " " << n << endl;
} else
{
int ans = n;
int t = ans;
while (noprime[t])
{
t++;
}
cout << t << endl;
repd(i, 2, n)
{
cout << i << " " << i - 1 << endl;
}
cout << 1 << " " << n << endl; int id = 1;
while (noprime[ans])
{
ans++;
cout << id << " " << id + n / 2 << endl;
id++;
}
} return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

最新文章

  1. 遭遇Web print
  2. Issue 7: 网络in action
  3. android控件的对齐方式(转)
  4. Ubuntu下安装 jdk6
  5. How to remove k__BackingField from Json data
  6. NLP自然语言处理学习笔记三(集成开发环境)
  7. Jmeter_初步认识随笔
  8. CentOS 6.5安全加固及性能优化
  9. 3DTouch简单了解
  10. 如何验证所做的AIX系统备份是否可用
  11. 论述Redis和Memcached的差异
  12. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
  13. 操作Work、Excel、PDF
  14. PHP加密解密函数(带有效期,过了有效期也解不了)
  15. soapUI的安装及破解
  16. python守护进程
  17. 安装FreeIPA以及应用时报错汇总
  18. 第41课 kmp子串查找算法
  19. 进程和线程(4)-进程 vs. 线程
  20. Python的CGI编程实现-通过接口运行服务器py脚本

热门文章

  1. 阶段3 1.Mybatis_12.Mybatis注解开发_8 mybatis注解开发使用二级缓存
  2. git 如何把master分支代码合并到自己的分支
  3. rocketmq的一些内容
  4. MySQL 常见面试知识点
  5. 解决某些软件无法在parallels desktop虚拟机下运行
  6. SpringBoot如何使用PUT、DELETE请求方式
  7. 【Linux 驱动】简单字符设备驱动架构(LED驱动)
  8. HDU 6175 算术
  9. springboot基于CORS处理跨域问题
  10. keil格式化项目代码