题目:输入一个正整数M,若M可表示为 m(m>1) 个连续正整数之和,则输出YES,反之输出NO;
eg:
输入 15
因为15可以满足分解为:
15 = 7+8
15 = 4+5+6
15= 1+2+3+4+5
所以输出为:YES
解题思路:
若M满足条件,M=a+(a+1)+(a+2)+(a+3)+…+(a+n-1)= (2*a+n-1)n/2, 则在2a+n-1与n中,一个为偶数一个为奇数,而2^n没有奇因子,故M !=2n.在二进制位运算中2n & 2 ^n - 1 结果等于0;
python 代码片段
def func():
num = int(input())
if 1 < num < 2**30+1 and num & (num - 1) != 0:
print('YES')
else:
print('NO')
if __name__ == "__main__":
func()