[CF1178D] Prime Graph 的题解

题目大意

构造一个简单无向图,是所有的有度的点的度都是质数而且总共的边的数量的个数是质数。

思路

因为需要让所有的入度都为质数,所以我们可以找到两个相邻的质数 \(2,3\),因为这样即使增加了一条边那么这个节点的度也是质数。

先将这个图构成一个巨大的环,接着如果所有的边数并不是质数,那么就随便找两个不相邻的点连边。

因为在 \(2000\) 以内,质数都是十分密集的,所以即使是最坏的情况,那么大于 \(2\cdot n\) 最近的质数也不会超过 \(n/2\),直接将相距很远的点连边就可以了。

AC Code

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,a[N],s;
bool ck(int x){
	for(int i=2;i*i<=x;i++) if(x%i==0) return 0;
	return 1;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>n;
	while(!ck(s+n)) s++;
	cout<<n+s<<'\n';
	for(int i=1;i<=n;i++) cout<<i<<' '<<((i+1>n)?(i+1-n):(i+1))<<'\n';
	for(int i=1;i<=s;i++) cout<<i<<' '<<((i+n/2>n)?(i+n/2-n):(i+n/2))<<'\n';
	return 0;
}
posted @ 2024-07-14 13:47  未抑郁的刘大狗  阅读(6)  评论(0编辑  收藏  举报