zoukankan      html  css  js  c++  java
  • CF1178D Prime Graph

    传送门

    读懂题之后发现条件一和条件二并没有什么用
    然后对于条件四显然可以将整个图连成一个环
    然后考虑条件三怎么满足?
    假如点数正好是质数,直接就满足了
    否则
    此时所有点的度数都是2。
    给每个点多连一条边,度数依然是质数
    发现这样最多可以连(lfloor frac{n}{2} floor)条边,1000以内的合数与最近的质数没有超过(lfloor frac{n}{2} floor)的,所以枚举一下质数,直接连就行了
    代码:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define rg register
    void read(int &x){
        char ch;bool ok;
        for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
        for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
    }
    const int maxn=1110,N=1100;
    int n,pri[maxn],tot,m;bool vis[maxn];
    void prepare(){
        vis[1]=1;
        for(rg int i=2;i<=N;i++){
    	if(!vis[i])pri[++tot]=i;
    	for(rg int j=1;j<=tot&&pri[j]*i<=N;j++){
    	    vis[pri[j]*i]=1;
    	    if(i%pri[j]==0)break;
    	}
        }
    }
    int main(){
        read(n),prepare();
        if(!vis[n]){
    	printf("%d
    ",n);
    	for(rg int i=1;i<n;i++)printf("%d %d
    ",i,i+1);
    	printf("%d %d
    ",1,n);
    	return 0;
        }
        int t=lower_bound(pri+1,pri+tot+1,n)-pri;
        m=pri[t]-n;
        printf("%d
    ",n+m);
        for(rg int i=1;i<n;i++)printf("%d %d
    ",i,i+1);
        printf("%d %d
    ",1,n);
        for(rg int i=1;i<=m;i++)printf("%d %d
    ",i,n-i);
    }
    
  • 相关阅读:
    chrome 开发者工具
    iOS-登陆界面 实现光标换行功能
    iOS-UIkit复习和代理的使用实现文本框限制输入字数控制
    iOS-代理模式
    ios-疯狂猜图
    ios-状态栏的改变
    iOS-应用管理 点击按钮下载动画
    ios-利用xib重新写 应用管理
    ios-应用管理 字典转模型
    ios-应用管理
  • 原文地址:https://www.cnblogs.com/lcxer/p/11242355.html
Copyright © 2011-2022 走看看