1.題目鏈接:19714 數字詩意
這道題是一道數學題。
先考慮奇數,已知奇數都可以表示為兩個相鄰的數字之和,2k+1=k+(k+1)?,那么所有的奇數都不會被計入。
那么就需要考慮偶數什么情況需要被統計。根據打表,其實可以發現除了的偶數都可以被分成連續數字相加的和。那么該如何證明呢?
設該偶數為,根據首項*項數/2的求和公式得:
。
對m進行分類討論:
- 若m為奇數,則2x+m為奇數,m+1為偶數,
至少有一個奇因子(來自(2x+m))。
- 若 m 為偶數,則?2x+m為偶數,m+1 為奇數,
至少有一個奇因子(來自m+1)。
因此,如果? 可以表示為連續的正整數相加,其至少含有一個奇因子,必然不會是2的冪次。
需要注意的是數據范圍是:,則需要開long long,要養成注意數據范圍的好習慣。
#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long int
using namespace std;
int n;int check(ll num) //判斷是否為2^n的值
{int rest,ans_number=0;while(num){rest=num%2;if(rest == 1) ans_number++;num/=2;}if(ans_number == 1) return 1;else return 0;
}int main()
{int ans=0;cin>>n;for(int i=1;i<=n;++i){ll a;cin>>a;if(check(a) == 1) ans++;}cout<<ans; return 0;
}
官方代碼:
#include<bits/stdc++.h>
using namespace std;
int main(){int n , cnt = 0;cin >> n;for(int i = 1 ; i <= n ; i ++){long long x;cin >> x;if(x & (x - 1)) cnt ++ ; //直接進行位運算} cout << n - cnt << '\n';return 0;
}