ZOJ 4081 Little Sub and Pascal's Triangle 题解

题意

求杨辉三角第n行(从1开始计数)有几个奇数。

考察的其实是杨辉——帕斯卡三角的性质,或者说Gould's sequence的知识。

其实网上很多题解都给出了答案,但大多数都只是给了一个结论或者说找规律(虽然我也是选择打表找规律先做的),但是思考为什么的时候我百度了一下,在wiki看了一些东西。

wiki Pascal's trianglehttps://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 sequencehttps://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 题解的更多相关文章

  1. 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 ...

  2. [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, ...

  3. [LeetCode] Pascal's Triangle 杨辉三角

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  4. 【leetcode】Pascal's Triangle II

    题目简述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Retur ...

  5. 【leetcode】Pascal's Triangle

    题目简述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...

  6. LeetCode 118 Pascal's Triangle

    Problem: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows  ...

  7. 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 ...

  8. LeetCode - Pascal's Triangle II

    题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return ...

  9. 【leetcode】Pascal's Triangle I & II (middle)

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

随机推荐

  1. chromedriver和firefox driver的安装过程

    环境:ubuntu14.04, python2.7 selenium2.0 文章参考出处:http://blog.csdn.net/heybob/article/details/52922645 ch ...

  2. 如何使用Xcode调试Shader代码Bug导致的渲染问题

    我最近发现了一个与Unity中的表面着色器有关的小Bug. 你可以看到如下所示的渲染瑕疵. 有时人们会将相似的渲染瑕疵归因于同时使用HDR和Bloom效果,但实际上,表面着色器是错误的,至少在本文中所 ...

  3. Web渗透测试漏洞手册及修复建议

    Web渗透测试漏洞手册及修复建议 0x0 配置管理 0x01 HTTP方法测试 漏洞介绍: 目标服务器启用了不安全的传输方法,如PUT.DELETE等,这些方法表示可能在服务器上使用了 WebDAV, ...

  4. 基于 React 实现一个 Transition 过渡动画组件

    过渡动画使 UI 更富有表现力并且易于使用.如何使用 React 快速的实现一个 Transition 过渡动画组件? 基本实现 实现一个基础的 CSS 过渡动画组件,通过切换 CSS 样式实现简单的 ...

  5. C#代码实现-冒泡排序

    冒泡排序原理:(升序)通过当前位置数和后一个位置数进行比较 如果当前数比后一个数大 则交换位置, 完成后 比较基数的位置变成下一个数.直到数组末尾,当程序运行完第一遍 最大的数已经排序到最后一个位置了 ...

  6. C# 数据类型详解以及变量、对象与内存

    学习刘铁猛老师<C#语言入门详解>视频,针对其中重点知识点进行总结. 1.什么是类型? 类型又称为数据类型(Data Type),数据类型在数据结构中的定义是一个值的集合以及定义在这个值集 ...

  7. Android Gradle报错 (Error:No such property: GradleVersion for class: JetGradlePlugin) 的原因与解决

    Error:No such property: GradleVersion for class: JetGradlePlugin 错误原因:IDE 版本(GradlePlugin)和 Gradle 版 ...

  8. 《ADCrowdNet》密集人群检测论文笔记

    背景 为了解决高密度的计数问题.(PS:就是attention机制的应用) 网络 整体网络结构图 attention部分的网络AMG 密度图预测网络 DConv代表可变形卷积,下图是常规卷积(左)与可 ...

  9. mysql必知必会--排序检索数据

    排序数据 其实,检索出的数据并不是以纯粹的随机顺序显示的.如果不排 序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初 添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺 序将会受 ...

  10. 小白的linux笔记3:对外联通——开通ssh和ftp和smb共享

    1.SSH的开通.https://www.cnblogs.com/DiDiao-Liang/articles/8283686.html 安装:yum install sshd或yum install ...