数字诗意
在诗人的眼中,数字是生活的韵律,也是诗意的表达。
小蓝,当代顶级诗人与数学家,被赋予了”数学诗人”的美誉。他擅长将冰冷的数字与抽象的诗意相融合,并用优雅的文字将数学之美展现于纸上。
某日,小蓝静坐书桌前,目光所及,展现着 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+m−1)
等差数列求和
S
=
m
(
2
n
+
m
−
1
)
2
S = \frac{m(2n+m-1)}{2}
S=2m(2n+m−1)
如果m是奇数,那么 2n+m - 1是偶数
S
=
m
(
2
n
+
m
−
1
)
2
S = \frac{m(2n+m-1)}{2}
S=2m(2n+m−1)中,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();
}
}