具体数学-第8课(取整进阶)

原文链接:

具体数学-第8课 - WeiYang Blog

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

例题1

给出下列递归式:

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

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

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

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

约瑟夫环新解

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

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

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

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

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

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

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

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

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

v2-ab75e57b1a22aac9f6ecf2e715257626_b.jpg




所以他上一次的编号是

因为

所以上一次编号可以写为

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

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

其中

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

算法伪代码如下:

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

其中

模的性质

定义与性质

模定义如下:

特别的

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

形象理解如下图所示:

v2-926c62086ad6699a1f09afae9cd5cc44_b.jpg

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

模有一些性质:

应用

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

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

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

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

为什么呢?假设

那么

时,

时,

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


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


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

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;
}

      

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

算法码上来 文章被收录于专栏

公众号「算法码上来」。godweiyang带你学习算法,不管是编程算法,还是深度学习、自然语言处理算法都一网打尽,更有各种计算机新鲜知识和你分享。别急,算法码上来。

全部评论

相关推荐

码农索隆:卡学历都不行了,开始卡颜值了
点赞 评论 收藏
分享
弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务