ZOJ 4081 Little Sub and Pascal's Triangle 题解
ZOJ 4081 Little Sub and Pascal's Triangle 题解
题意
求杨辉三角第n行(从1开始计数)有几个奇数。
考察的其实是杨辉——帕斯卡三角的性质,或者说Gould's sequence的知识。
其实网上很多题解都给出了答案,但大多数都只是给了一个结论或者说找规律(虽然我也是选择打表找规律先做的),但是思考为什么的时候我百度了一下,在wiki看了一些东西。
wiki Pascal's triangle(https://en.wikipedia.org/wiki/Pascal%27s_triangle)
- Parity: To count odd terms in row n, convert n to binary. Let x be the number of 1s in the binary representation. Then the number of odd terms will be 2x. These numbers are the values in Gould's sequence.[20]
wiki Gould's sequence(https://en.wikipedia.org/wiki/Gould%27s_sequence#cite_note-oeis-1)
证明
严格的证明可以自行搜索相关论文。
我这里给一个基于二项式定理的证明。
最后一步是因为i只有取或者
,
为奇数,否则为偶数。这个的不懂的可以看后面。
上面的证明已经说明了当指数为的形式时,取奇数的只有首尾两项。
因此对于一个任意的指数n,我们可以分解为若干个的和——
若。任意两个指数
不相等。
则
注意我们需要统计杨辉——帕斯卡三角形第n行(从0开始计数,原题是从1开始计数,输入减去1就好)的奇数个数。所以我们应当关注的是二项式定理展开后各项的系数中为奇数的个数。
而我们上面这一步拆解为了m个式子的乘积,而且m个式子都只有2项,且各项的系数都是奇数。由于每一项中的x的指数都是形式,且各不相等,所以从这个m个括号式子中每个选一项(可以选
或者
),则得到展开后一个x的若干次方的项。容易发现不会有合并同类项的情况出现。而且奇数系数乘以奇数系数,系数仍然是奇数。
所以根据乘法定理,一共有项(并且系数一定为奇数)。
这就是说如果对于输入n,我们先减去1,在用二进制形式表示,统计1的个数,为m,则答案为.
i只有取
或者
,
为奇数,否则为偶数
这个其实根据组合数的定义可以比较容易证明,
首先值为奇数的情况显然
现在考虑
①i是奇数
组合数是个里任意选择i个的方案数。
现在我们把个数排成一排,并且均分为左右两部分。使左右两部分关于中间成轴对称。
emmm……
一图胜千言
若有一种选法A,则将每一个选取的点替换为他的对称点,则得到另一种选法B。因为i是奇数,所以A和B必然是两种不同的选法。并且易得,一种选法的对称选法是唯一的。
所以总的选法的数量是偶数。
②i是偶数
i是偶数时,对于一种选法A我们依然可以通过对称的方法得到选法B。
但是由于i是偶数,所以可能会存在A和B是同一种选法的情况,所以
的奇偶性
自对称(A,B相同)选法数的奇偶性
而自对称(A,B相同)选法数即.(左边
个中任意选择一半,另一半由对称性在右边确认)
因此如果选取数依旧是偶数,则继续进行除以2的迭代。
这样,根据数论,经过有限步数迭代之后一定会达到选取数为奇数,转化为情况①。
毕。
源代码
import java.util.*;
public class Main {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int n = sc.nextInt();
for (int i = 0;i < n; ++i) {
OddElementCountOfYanghuiTriangleRow p = new OddElementCountOfYanghuiTriangleRow();
System.out.println(p.count());
}
}
}
class OddElementCountOfYanghuiTriangleRow{
long row;
OddElementCountOfYanghuiTriangleRow() {
row = Main.sc.nextLong()-1;
}
long count() {
long t = row;
long cnt = 1;
while (t > 0) {
if ((t & 1) != 0)
cnt <<= 1;
t >>= 1;
}
return cnt;
}
}
ZOJ 4081 Little Sub and Pascal's Triangle 题解的更多相关文章
- ZOJ - 4081:Little Sub and Pascal's Triangle (结论)
Little Sub is about to take a math exam at school. As he is very confident, he believes there is no ...
- [LeetCode] Pascal's Triangle II 杨辉三角之二
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- [LeetCode] Pascal's Triangle 杨辉三角
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- 【leetcode】Pascal's Triangle II
题目简述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Retur ...
- 【leetcode】Pascal's Triangle
题目简述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...
- LeetCode 118 Pascal's Triangle
Problem: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows ...
- LeetCode 119 Pascal's Triangle II
Problem: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Ret ...
- LeetCode - Pascal's Triangle II
题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...
- 【leetcode】Pascal's Triangle I & II (middle)
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
随机推荐
- 如何重写object虚方法
在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它.前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToStrin ...
- 了解JavaScript的语法基础,值和变量
通过JavaScript语法基础学习了解到1.怎么使用js/*通常js的引入和css一样,分为内部,外部和行内引入,执行自上而下,有着先后顺序*/:2.js的语法/*2.1js是用字母,数字.特殊字符 ...
- 微信小程序如何下载超过大小限制(10M)的视频?(苹果用户仔细看,安卓用户快速看)
众所周知,微信小程序对下载的文件大小有限制,目前是最大支持10M.我们在用去水印小程序保存视频的时候,如果遇到长视频,视频大小可能就超过限制.遇到这种情况,我们如何才能把视频保存到手机相册呢? 首先, ...
- 15.Android-实现TCP客户端,支持读写
在上章14.Android-使用sendMessage线程之间通信我们学习了如何在线程之间发送数据. 接下来我们便来学习如何通过socket读写TCP. 需要注意的是socket必须写在子线程中,不能 ...
- Android中实现一个简单的逐帧动画(附代码下载)
场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 ...
- RadioButton改写的开关按钮
先上效果图: 这个控件其实是俩个RadioButton,通过样式就可以实现. 样式资源: <Style x:Key="Tong_Yong_RadioButtonStyle" ...
- Spring Bean自动装配有哪些方式?
Spring 容器能够自动装配 Bean .也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 Bean 的协作者. 自动装配的不同模式: no - 这是默认设置,表示没 ...
- Visual Studio Code中C/C++的环境配置
Visual Studio Code 的功能十分强大,但是对我这种小白不是很友好,它和其它的集成开发工具不同,Visual Studio Code (以下简称VS)自身其实仅仅是一个编辑器, 是不具备 ...
- 电信IOT平台固件升级
1 离线签名 注意事项:特别重要,被坑了好久 A 将差分文件.bin格式的压缩成.zip 再进行签名 B 不能再中文目录下 否则,会出现校验失败 记住私钥 2 上传公钥 3 上传固件包 4 ...
- 【DTOJ】2703:两个数的余数和商
DTOJ 2703:两个数的余数和商 解题报告 2017.11.10 第一版 ——由翱翔的逗比w原创,引用<C++ Primer Plus(第6版)中文版> 题目信息: 题目描述 给你a ...