题目:
题意:给出数字n,找出两种序列,要求下标和数字不同并且与值为0(不为0)
分析:一个只在最高位有1的数字n(例如10000B),n+i-1和n-i每一位正好相反(i=1,2,3……),与值为0.则如果n为偶数,可以构造出第一种序列,从n开始,以最高位为1且小于n的数字为对称轴组合。例如n=10,找到的对称轴为8,第一次处理完10-5、9-6、8-7,不断更新上界,第二次再从6开始类似的处理。只要是偶数一定可以找到答案。
与值不为1,若最大值n为100000B这样的数字,只有最高位有1而且它为最大值,怎么都不可能有数字和他与值为1且和他不同,则输出NO。剩余情况可以利用lowbit函数找到n的最末位1,从n到这个数字之间的数字一定有这一位公共的1(例如100100B,找到的为100100B+100B=101000B),只需要保证他们不和下标相等即可,不断更新下界,小数字会出现问题,特判小于8的情况。
代码:
1 #define _CRT_SECURE_NO_DEPRECATE 2 #pragma comment(linker, "/STACK:102400000,102400000") 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include