<题目链接>

题目大意:

给出n、m,现在需要你输出任意n个不相同的数(n,m<1e5),使他们的异或结果为m,如果不存在n个不相同的数异或结果为m,则输出"NO",本题中所有数均需小于1e6。

解题分析:
因为本题是SPJ,且当n比较大的时候,需要输出很多数,所以我们试着去构造这n个数,力图找出一些规律。n<=2的时候很好直接进行特判即可。n>=3的时候,可以直接进行简单的构造,比如前面n-1项依次设为1,2,3,……(下面假设前面这些连续的项异或结果为res),最后一项为  cur = res^m (这是根据 0^x = x ,这个公式得到的,即前面的所有项都进行简单构造,然后最后一项让这n个数的异或结果为m)。这样看上去很完美,实际上存在一些漏洞。因为题目要求这n个数必须不相同,但是按照上面的构造方法,是可能让cur与前面n-1个数相同的,不相信的同学可以简单构造反例,所以,我们需要引进两个大的二进制数来避免这种情况,因为按照我们前面的够着方法,前n-1个数最大会小于n,而n<1e5,但是题目对我们构造的数的范围要求要小于1e6,所以我们可以添加两个大于1e5,小于1e6的数,同时,尽量让这两个数与之前构造的n-3个数之间相互异或的结果都不能为0 (至于为什么是要两个这样的数,可以自行举反例,主要的判断冲突依据就是这n个数必须互不相同)。所以最后的一个数cur = res^x1^x2^m。

#include <iostream>
using namespace std; int main(){
ios::sync_with_stdio(false);
int n,m;cin>>n>>m;
if(n==){
puts("YES");
cout<<m<<endl;
}else if(n==){
if(!m) {
puts("NO");
}else {
puts("YES");
cout<<"0 "<<m<<endl;
}
}else{
int x1=<<,x2=<<;
puts("YES");
int res=;
for(int i=;i<=n-;i++){
cout<<i<<" ";
res^=i;
}
cout<<x1<<" "<<x2<<" "<<(res^x1^x2^m) <<endl;
}
}

2019-02-01

最新文章

  1. Webpack从入门到上线
  2. 组合suan
  3. 使用javascript实现贪吃蛇游戏
  4. vpython初探
  5. Codeforces Round #243 (Div. 2) B. Sereja and Mirroring
  6. strcpy, memcpy, memset函数
  7. 前端开发规范之html编码规范
  8. leetcode 题解:Remove Duplicates from Sorted Array II(已排序数组去三次及以上重复元素)
  9. UILabel滚动字幕的实现
  10. [转载]Log4net学习笔记
  11. jQuery easyUI框架中经常出现的问题
  12. 部署war包到Tomcat
  13. 在pcDuino上刷了AndDroid,Ubuntu,XBMC
  14. Operation System - Peterson&amp;#39;s Solution算法 解决多线程冲突
  15. UVA 11464 Even Parity(递归枚举)
  16. [python学习笔记] 数据类型与语法
  17. Pyspark-SQL 官方 API 的一些梳理(上)
  18. boost asio 学习(一)io_service的基础
  19. [AWS] Amazon Cognito
  20. 报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm-&gt;GetEnv() return code = -2

热门文章

  1. 配置一个 Confluence 6 环境
  2. Confluence 6 Cron 表达式
  3. nginx之访问控制http_access_module与http_auth_basic_module
  4. 三.NFS存储服务
  5. Laravel 项目中编写第一个 Vue 组件
  6. c++与java的几个不同点
  7. Docker快速部署gitlab
  8. Java接口自动化测试之TestNG学习(二)
  9. 20165206 2017-2018-2 《Java程序设计》第9周学习总结
  10. Windows 添加永久静态路由