原文链接:

具体数学-第8课 - WeiYang Blog

今天主要讲了取整与递归式的结合,还有取模的相关知识。

例题1

给出下列递归式:

现在不要求你求解,要你证明:

首先想到的就是数学归纳法,假设对于任意 ,都有 ,那么:

如果 ,那么
如果 ,那么 ,这时不成立。

所以数学归纳法无法证明,今后我们会用其他方法来证明这个式子。

约瑟夫环新解

还记得约瑟夫环问题吗?详见第一节课。

这里我们继续推广到一般情况,如果有 个人,每隔 个人踢掉一个人,最后剩下的是几号?

初始编号为 ,现在考虑一种新的编号方式。

第一个人不会被踢掉,编号加 ,变成 ,然后第二个人编号变为 ,直到第 个人,他被踢掉了。

然后第 个人编号继续加 ,变成了 ,依次下去。

考虑当前踢到的人编号为 ,那么此时已经踢掉了 个人,所以接下去的人新的编号为

所以编号为 的人编号变成了 ,其中

直到最后,可以发现活下来的人编号为 ,问题是怎么根据这个编号推出他原来的编号?

为例,下图就是每个人新的编号:



所以他上一次的编号是

因为

所以上一次编号可以写为

因此最后存活的人编号可以用如下的算法计算:

        N = qn
while N > n:N = k + N - n
ans = N

其中

如果我们用 替代 ,将会进一步简化算法:

算法伪代码如下:

        D = 1
while D <= (q-1)n:D = k
ans = qn + 1 - D

其中

模的性质

定义与性质

模定义如下:

特别的

与此类似,定义一个与模类似的运算:

形象理解如下图所示:

圆的周长是 ,一共走过的路长(红色+绿色部分)是 ,所以 就是绿色部分, 就是一圈长度减去绿色部分。

模有一些性质:

应用

考虑如下问题,怎么平均分配 个东西给 个人?

很容易想到,首先分给每个人 个东西,剩下 件东西分给前 个人,一人多一件就行。

概括起来就是,前 个人,每人 件,剩下的人,每人 件。

那有没有办法统一表示呢?有的,每个人分到的件数为

为什么呢?假设

那么

时,

时,

得证,因此可以得到如下等式:


可以进一步将其转换为下取整形式:


我们得到了一个令人惊奇的等式:

HDU3089

最后用今天介绍的约瑟夫环算法来解决一道经典的ACM题!题目链接:杭电3089。

C++代码如下:

        #include<bits/stdc++.h>
using namespace std;typedef long long LL;LL Ceil(LL x, LL y) {if (x % y == 0) return x / y;return x / y + 1;
}LL J(LL n, LL q) {LL D = 1, end = (q - 1) * n;while (D <= end) {D = Ceil(q * D, q - 1);}return q * n + 1 - D;
}int main() {LL n, q;while (~scanf("%lld%lld", &n, &q)) {printf("%lld\n", J(n, q));}return 0;
}

比网上各种快速算法还要快哦,理论时间复杂度是 的。

具体数学-第8课(取整进阶)相关推荐

  1. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  2. python中负数取余和取整

    网上看到好多总结python取余取整的,基本都是根据现象来人为解释,都没有说清楚根本原因,其实就是很简单的数学思路. 首先取整比较好理解,就是向下取整,2.3取2,-2.3取-3: 取余其实是根据取整 ...

  3. math python 向上取整_Python的数值基本运算和其它数学运算方法

    数值基本运算 支持最基本的数学运算符号:+ - * / % **.取正负+x -x,地板除法//,除法和取模divmod(x, y): 12345678910111213141516171819202 ...

  4. EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数

    1 公式计算后的数,用只粘贴数值后,后面自动多了 0.0001,导致不再是整数的问题 问题入戏 见第1个8400,计算时就出现了问题,按正常,这里8400应该是整数,而不应该带小数,但是确实就计算出了 ...

  5. Java学习(静态static关键字,数组工具类Arrays,数学相关工具类(绝对值,向上取整,向下取整),继承,super和this关键字,抽象)

    2022/1/2 (1/6)Java学习 1.静态Static关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份. 2.静态stat ...

  6. JavaScript数学运算(取整,取余和取模)

    来源 | https://www.fly63.com 这篇文章主要介绍js取整.取余和取模的实现方法和它们之间的区别,以及Math对象的常用方法函数介绍,有需要的朋友可以参考下. 取整 在项目开发过程 ...

  7. js数学运算 取整、取余、取模

    Math 对象的方法介绍 ​ abs(x) 返回数的绝对值 1 2 3 acos(x) 返回数的反余弦值 1 2 3 asin(x) 返回数的反正弦值 1 2 3 atan(x) 以介于 -PI/2 ...

  8. js取整、四舍五入等数学函数

    js只保留整数,向上取整,四舍五入,向下取整等函数 1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Mat ...

  9. js - 数学运算(取整,取余)

    取整 1.取整//保留整数部分 parseInt(3/2) // 12.向上取整// 向上取整,有小数就整数部分加1 Math.ceil(3/2) // 23.四舍五入// 四舍五入 Math.rou ...

  10. python中math.ceil是什么意思_python中的数字取整(ceil,floor,round)概念和用法

    python中的数学运算函数(ceil,floor,round)的主要任务是截掉小数以后的位数.总体来说 就是取整用的.只是三者之间有微妙的区别: floor() :把数字变小 ceil() : 把数 ...

最新文章

  1. 如何撰写将赢得客户青睐的自由职业者提案和免费模板
  2. ThreadLocal 简介
  3. python【力扣LeetCode算法题库】15- 三数之和
  4. 翟树卿:如何让数据挖掘助力精准化营销
  5. C#中的委托,匿名方法和Lambda表达式
  6. .NET使用NPOI读取Word模板并替换关键字并下载
  7. php 图片单位转换,php如何把图片转换成二进制字符串
  8. Flutter ScrollView 滑动组件
  9. tensorflow 遇到的细节问题
  10. JAVA遇见HTML——JSP篇:JSP内置对象(上)
  11. 台式计算机如何连接投影仪,台式机PC怎样与投影仪连接
  12. SEO流量工具-免费SEO流量排名优化工具
  13. 火山PC自绘高级表格及超级列表框
  14. mpvue + vuex搭建小程序详细教程
  15. 大面积无线网络覆盖5大方案,满足不同场所的实际需求
  16. 【系统分析师之路】第十六章 复盘计算机网络(新技术领域)
  17. Codeforces Round #271 (Div. 2) F ,E, D, C, B, A
  18. 如何系统掌握产品功能改进方案?
  19. 在已安装win10环境中利用EasyBCD引导安装Ubuntu16.04-小白补充
  20. 1447_TC275 DataSheet阅读笔记8_电气特性

热门文章

  1. phpmailer 与 mail
  2. uwsgi基础——参数
  3. 第1章 Spring Cloud 构建微服务架构(一)服务注册与发现
  4. pyplot gtk2 conflicts with gtk3
  5. 51nod1437 迈克步
  6. poi导出word模板项目实例(一个文件)
  7. GridView中 选中checkbox,在上下页 保存选中的值
  8. 订单同步工程标准化改造事记
  9. R语言入门1:安装R和RStudio
  10. MacOS平台上编译 hadoop 3.1.2 源码