【蓝桥杯14天冲刺课题单】Day 8

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;
}
相关推荐
sulikey17 小时前
C++类和对象(下):初始化列表、static、友元、内部类等核心特性详解
c++·static·初始化列表·友元·匿名对象·内部类·编译器优化
oioihoii18 小时前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
开发语言·网络·c++
程序员东岸18 小时前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
程序员-King.19 小时前
day104—对向双指针—接雨水(LeetCode-42)
算法·贪心算法
笨鸟要努力19 小时前
Qt C++ windows 设置系统时间
c++·windows·qt
神仙别闹19 小时前
基于C++实现(控制台)应用递推法完成经典型算法的应用
开发语言·c++·算法
Ayanami_Reii19 小时前
进阶数据结构应用-一个简单的整数问题2(线段树解法)
数据结构·算法·线段树·延迟标记
listhi52020 小时前
基于改进SET的时频分析MATLAB实现
开发语言·算法·matlab
Keep_Trying_Go20 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
xl.liu21 小时前
零售行业仓库商品数据标记
算法·零售