题目

给出一个 $n$,判断是否存在 $n$ 个顶点的自补图,如果存在,输出边和映射。

分析

一个无向图若同构于它的补图,则称该图为自补图

定理:一个自补图一定存在 $4k$ 或 $4k+1$ 个顶点.

证:

原图的边数+补图的边数=完全图的边数=n(n-1)/2

由于原图与补图同构,所以边数相等,

所以,原图的边数=n(n-1)/4,

边数肯定为整数,所以 4|n 或者 4|(n+1).

现在的问题是如何构造呢?

先考虑 $n=4k$,将其分成两半,

一半连接成完全图,一半为独立的点,

这样边数还不够,再将左上和右下一一相连,右上和左下一一相连。

很容易发现其补图变形一下就跟它一样,然后找一下对应关系。

#include<bits/stdc++.h>
using namespace std; int n; int main()
{
int T, kase=;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
printf("Case #%d: ", ++kase);
if(n % == )
{
printf("Yes\n");
int k = n/;
for(int i = ; i<= k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = k+;i <= *k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("\n");
}
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = k;i >= ;i--) printf("%d ", i);
for(int i = *k;i >= k+;i--) printf("%d%c", i, i == k+? '\n':' ');
}
else if(n % == )
{
printf("Yes\n");
int k = n/;
for(int i = ; i<= k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("1\n");
}
for(int i = k+;i <= *k;i++)
{
for(int j = ; j <= *k;j++)
{
if(j == i) printf("");
else printf("");
}
for(int j = *k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("1\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("0\n");
}
for(int i = *k+;i <= *k;i++)
{
for(int j = ;j <= k;j++) printf("");
for(int j = k+;j <= *k;j++) printf("");
for(int j = *k+;j <= *k;j++) printf("");
printf("0\n");
}
for(int i = ;i <= *k;i++) printf("");
for(int i = *k+;i <= *k+;i++) printf("");
printf("\n"); for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = *k;i >= *k+;i--) printf("%d ", i);
for(int i = k;i >= ;i--) printf("%d ", i);
for(int i = *k;i >= k+;i--) printf("%d ", i);
printf("%d\n", *k+);
}
else
{
printf("No\n");
}
}
}

2019牛客多校E Androgynos——自补图&&构造的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  3. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  4. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  5. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  6. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  7. 2019牛客多校第四场 A meeting

    链接:https://ac.nowcoder.com/acm/contest/884/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言10485 ...

  8. [2019牛客多校第二场][G. Polygons]

    题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...

  9. 2019 牛客多校第一场 D Parity of Tuples

    题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...

随机推荐

  1. [转帖]APP逆向神器之Frida【Android初级篇】

    APP逆向神器之Frida[Android初级篇] https://juejin.im/post/5d25a543e51d455d6d5358ab 说到逆向APP,很多人首先想到的都是反编译,但是单看 ...

  2. K8S从入门到放弃系列-(4)kubernetes集群之kubectl命令行工具部署

    摘要:随着版本的不断迭代,k8s为了集群安全,集群中趋向采用TLS+RBAC的安全配置方式,所以我们在部署过程中,所有组件都需要证书,并启用RBAC认证. 我们这里采用二进制安装,下载解压后,把对应组 ...

  3. 《Mysql 事务 - 隔离》

    一:事务概念 -  ACID(Atomicity.Consistency.Isolation.Durability,即原子性.一致性.隔离性.持久性) 二:事务产生的问题 - 多个事务同时执行的时候 ...

  4. redis事务、并发及应用场景

    目录 事务概念 事务命令 乐观锁 悲观锁 并发控制及过期时间 队列 队列防丢失 阻塞队列 时间区间控制 持久化 RDB AOF 命令追加 文件写入.同步 RDB.AOF优缺点 RDB优缺 AOF优缺 ...

  5. SSH简介及两种远程登录的方法

    出处 https://blog.csdn.net/li528405176/article/details/82810342 目录 SSH的安全机制 SSH的安装 启动服务器的SSH服务 SSH两种级别 ...

  6. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

  7. Django之ORM表操作

    ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...

  8. Django 关联查询

    查询id=1的XXXXX关联的YYYYY信息 a = XXXXX.objects.get(id=1) a.YYYYY.all() 查询id=1的YYYYY关联的XXXXX信息 b = YYYYY.ob ...

  9. S04_CH01_搭建工程移植LINUX/测试EMMC/VGA

    S04_CH01_搭建工程移植LINUX/测试EMMC/VGA 1.1概述: 本章内容是在已经提供安装了VIVADO2015.4 的ubuntu系统下,进行.大家可以下周我们已经提供的虚拟机镜像,我们 ...

  10. 数据格式转换string.Format

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...