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,要养成注意数据范围的好习惯。
cpp
#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;
}
官方代码:
cpp
#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;
}