具体数学-第8课(取整进阶)
原文链接:
具体数学-第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课(取整进阶)相关推荐
- 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- python中负数取余和取整
网上看到好多总结python取余取整的,基本都是根据现象来人为解释,都没有说清楚根本原因,其实就是很简单的数学思路. 首先取整比较好理解,就是向下取整,2.3取2,-2.3取-3: 取余其实是根据取整 ...
- math python 向上取整_Python的数值基本运算和其它数学运算方法
数值基本运算 支持最基本的数学运算符号:+ - * / % **.取正负+x -x,地板除法//,除法和取模divmod(x, y): 12345678910111213141516171819202 ...
- EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数
1 公式计算后的数,用只粘贴数值后,后面自动多了 0.0001,导致不再是整数的问题 问题入戏 见第1个8400,计算时就出现了问题,按正常,这里8400应该是整数,而不应该带小数,但是确实就计算出了 ...
- Java学习(静态static关键字,数组工具类Arrays,数学相关工具类(绝对值,向上取整,向下取整),继承,super和this关键字,抽象)
2022/1/2 (1/6)Java学习 1.静态Static关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份. 2.静态stat ...
- JavaScript数学运算(取整,取余和取模)
来源 | https://www.fly63.com 这篇文章主要介绍js取整.取余和取模的实现方法和它们之间的区别,以及Math对象的常用方法函数介绍,有需要的朋友可以参考下. 取整 在项目开发过程 ...
- js数学运算 取整、取余、取模
Math 对象的方法介绍 abs(x) 返回数的绝对值 1 2 3 acos(x) 返回数的反余弦值 1 2 3 asin(x) 返回数的反正弦值 1 2 3 atan(x) 以介于 -PI/2 ...
- js取整、四舍五入等数学函数
js只保留整数,向上取整,四舍五入,向下取整等函数 1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Mat ...
- js - 数学运算(取整,取余)
取整 1.取整//保留整数部分 parseInt(3/2) // 12.向上取整// 向上取整,有小数就整数部分加1 Math.ceil(3/2) // 23.四舍五入// 四舍五入 Math.rou ...
- python中math.ceil是什么意思_python中的数字取整(ceil,floor,round)概念和用法
python中的数学运算函数(ceil,floor,round)的主要任务是截掉小数以后的位数.总体来说 就是取整用的.只是三者之间有微妙的区别: floor() :把数字变小 ceil() : 把数 ...
最新文章
- 如何撰写将赢得客户青睐的自由职业者提案和免费模板
- ThreadLocal 简介
- python【力扣LeetCode算法题库】15- 三数之和
- 翟树卿:如何让数据挖掘助力精准化营销
- C#中的委托,匿名方法和Lambda表达式
- .NET使用NPOI读取Word模板并替换关键字并下载
- php 图片单位转换,php如何把图片转换成二进制字符串
- Flutter ScrollView 滑动组件
- tensorflow 遇到的细节问题
- JAVA遇见HTML——JSP篇:JSP内置对象(上)
- 台式计算机如何连接投影仪,台式机PC怎样与投影仪连接
- SEO流量工具-免费SEO流量排名优化工具
- 火山PC自绘高级表格及超级列表框
- mpvue + vuex搭建小程序详细教程
- 大面积无线网络覆盖5大方案,满足不同场所的实际需求
- 【系统分析师之路】第十六章 复盘计算机网络(新技术领域)
- Codeforces Round #271 (Div. 2) F ,E, D, C, B, A
- 如何系统掌握产品功能改进方案?
- 在已安装win10环境中利用EasyBCD引导安装Ubuntu16.04-小白补充
- 1447_TC275 DataSheet阅读笔记8_电气特性