#include<stdio.h> int main(){ //如果是奇數,肯定滿足條件 int num; scanf("%d",&num); if(num%2==1){ printf("%s","YES"); return 0; } //如果是偶數 /** * * 設輸入的數值n為奇數,2k+1,那么奇數肯定能化成k+k+1,所以肯定是輸出yes。 如果輸入的數值n為偶數,要稍微復雜些。 反證,假設這個偶數能被換成連續自然數相加形式。 那么可以有x+(x+1)+(x+2)+……+(x+k) == n, 用等差數列求和公式,求出(2x+k)(k+1)/2 == n, 若k+1為偶數,則2x+k為奇數,若k+1為奇數,則2x+k為偶數,所以必定有一奇數和一個偶數。 我們把公式轉換成(2x+k)(k+1) == 2n,因為2n是偶數,左邊(2x+k)(k+1)一定有一個數值為偶數。 等式兩邊不斷提取因數2,如果2n可以不斷提取因數2化成2^m,也就是2的冪,而等式的左邊因為存在一個奇數,(2x+k)(k+1)是不能化成2^m。所以式子兩邊不可能相等。所以2的冪是不能轉換成連續自然數相加的形式。 但是沒有直接證明偶數可以拆成什么具體形式。所以這題只是鑽了題目的空子,同類型的題目好像還要輸出連續自然數的序列。所以這題可以直接判定n是否為2的冪即可。 * */ if((num & (num-1))==0){ printf("%s","NO"); }else{ printf("%s","YES"); } return 0; }
tips:斷給定的整數n能否表示成連續的m(m>1)個正整數之和.