您的位置:首页 > 科技 > IT业 > 安卓app定制开发公司_ppt下载网站哪个好_网盟推广是什么意思_手机版谷歌浏览器入口

安卓app定制开发公司_ppt下载网站哪个好_网盟推广是什么意思_手机版谷歌浏览器入口

2025/4/28 20:12:49 来源:https://blog.csdn.net/triticale/article/details/147458186  浏览:    关键词:安卓app定制开发公司_ppt下载网站哪个好_网盟推广是什么意思_手机版谷歌浏览器入口
安卓app定制开发公司_ppt下载网站哪个好_网盟推广是什么意思_手机版谷歌浏览器入口

数字诗意

在诗人的眼中,数字是生活的韵律,也是诗意的表达。

小蓝,当代顶级诗人与数学家,被赋予了”数学诗人”的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。

某日,小蓝静坐书桌前,目光所及,展现着 n 个数字,它们依次为 a1,a2,…,an,熠熠生辉。

小蓝悟到,如果一个数能够以若干个(至少两个)连续的正整数相加表示,那么它就蕴含诗意。

例如,数字 6 就蕴含诗意,因为它可以表示为 1+2+3。

而 8 则缺乏诗意,因为它无法用连续的正整数相加表示。

小蓝希望他面前的所有数字都蕴含诗意,为此,他决定从这 n 个数字中删除一部分。

请问,小蓝需要删除多少个数字,才能使剩下的数字全部蕴含诗意?

输入格式

第一行包含一个整数 n,表示展示的数字个数。

第二行包含 n 个整数 a1,a2,…,an,表示展示的数字。

输出格式

输出一个整数,表示小蓝需要删除的数字个数,以使剩下的数字全部蕴含诗意。

数据范围

对于 30% 的评测用例,1≤n≤ 1 0 3 10^3 103,1≤ai≤ 1 0 3 10^3 103
对于所有评测用例,1≤n≤2× 1 0 5 10^5 105,1≤ai≤ 1 0 16 10^{16} 1016

输入样例:
3
3 6 8
输出样例:
1
样例解释

在样例中,数字 3 可以表示为 1+2,数字 6 可以表示为 1+2+3,数字 8 无法表示为连续的正整数相加,因此,需要删除的数字个数为 1。

【思路分析】

看到这一题我的第一直觉就是用二进制每一位的权值不能表示成连续的正整数相加

于是打表玩了一把

2 0 2^0 20 = 1 (x)

2 1 2 ^ 1 21 = 2 (x)

3 = 1 + 2 (√)

2 2 2^2 22 = 4 (x)

5 = 2 + 3 (√)

6 = 1 + 2 + 3 (√)

7 = 3 + 4(√)

2 3 2^3 23 = 8 (x)

貌似还真的是这样,那么也就是说只有包含奇数因子的数才可以分成连续的正整数相加

我们证明一下

设数N不含有奇数质因子,那么N可以表示为 N = 2 k 2^k 2k,其中k为正整数。

假设N可以分解为m个连续正整数的和,设这m个连续正整数中最小的数为n,则这m个连续正整数的和为:
S = n + ( n + 1 ) + ( n + 2 ) + . . . + ( n + m − 1 ) S = n + (n+1) + (n+2) + ...+(n + m -1) S=n+(n+1)+(n+2)+...+(n+m1)

等差数列求和
S = m ( 2 n + m − 1 ) 2 S = \frac{m(2n+m-1)}{2} S=2m(2n+m1)
如果m是奇数,那么 2n+m - 1是偶数 S = m ( 2 n + m − 1 ) 2 S = \frac{m(2n+m-1)}{2} S=2m(2n+m1)中,m为奇数因子,这与N不含有奇数质因子矛盾。

如果m是偶数,设 m = 2p(p为正整数),则 S = p(2n + 2p + 1)

因为2n + 2p + 1为奇数,若S = N = 2 k 2^k 2k (不含奇数因子的数),此时 2n + 2p + 1 为其中一个奇数因子,这与N不含有奇数因子矛盾。

所以证得如果一个数能够分解为连续个正整数相加,那么这个数一定包含奇数因子

import java.io.*;
import java.util.*;
public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());long res = 0;String[] data = br.readLine().split(" ");for(int i = 0; i < n; i++) {long d = Long.parseLong(data[i]);while(d % 2 == 0) {d /= 2;}if(d == 1) {res++;}}System.out.print(res);br.close();}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com