C++分数取模【固定模板+讲解】

一、固定模板

       求解 (a / b) % M  


       主函数中:

ll ans = a * ksm(b, M - 2) % M;

        定义快速幂函数:

ll ksm(ll a, ll b){
    ll res = 1;
    while(b) {
        if(b & 1)                    // 如果当前b的二进制数字为1,即存在
            res = res * a % M;       // 结果乘上当前a
        a = a * a % M;               // 下一位的a的值(开平方)
        b >>= 1;                     // b的下一位二进制数
    }
    return res;
}

二、讲解

        对于要求对分数取模的题目,往往不能直接求解,需要用到下面的数学方法。

        首先,费马小定理对于质数p,任意整数a,均满足:b^{^{M-1}}=1(mod \, M)

        可转化为:a/b \, mod\, M = a*b^{M-2}\: mod \: M

        具体转化过程可参考:转化过程              详细原理介绍可参考:原理介绍

        接下来,就是常用数论知识中的快速幂。

        我们先看上面转化后的式子,就是快速幂所解决的问题:a^{b}\, mod\: M.

        为什么需要快速幂?因为如果朴素做的话需要乘一次a就模一次M,时间复杂度很高。但是快速幂就完美解决了这个问题,将时间由O(b)化为了O(log b).

        从时间复杂度就可以看出来,这肯定需要把幂(b)分解成2的次方形式,我们直接举个例子先帮助理解:

         图有些惨不忍睹,不过可以根据下面流程理解:

        1.我们要求3的5次方模5,我们先将b二进制化,如文中的b值为5——>101,这样,每个相应的2的n次方相加即为b值。

        2.但是呢,这个b值是一个幂,所以将整体相乘就可以实现幂的相加。

        这样的话,思路就很明显了,我们需要先将以2的 log b 次方为幂的整体分别预计算出来并模M,最后根据b的二进制相乘再取一次模得出答案。其实就是将原来一个1一个1乘换成了一个二进制数二进制数的乘,在其中分别取模。

        还记得dp多重背包的二进制优化吗?异曲同工之妙!

         这样再看代码中的注释,就很容易理解了(a不断开平方就是二进制数向前移位的数值整体增加过程)

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSP竞赛是中国青少年计算机应用能力大赛,旨在提高学生的计算思维能力和动手能力,培养创新精神和团队合作精神。CSP竞赛的知识点种类繁多,但以下几个关键知识点是必备的: 1. 数据结构:掌握栈、队列、链表、树等常用数据结构的基本原理和操作,能够熟练应用和选择合适的数据结构解决问题。 2. 算法设计与分析:了解常用的算法设计思想,如贪心算法、动态规划、分治法等,并能够分析算法的时间复杂度和空间复杂度。 3. 图论:熟悉图的基本概念和常见算法,如深度优先搜索、广度优先搜索、最短路径算法等,能够应用图论解决相关问题。 4. 数学基础:熟练掌握数论、组合数学、概率论等数学知识,能够利用数学方法解决问题。 5. 编程语言:具备良好的编程基础,掌握至少一种编程语言,如C++、Python等,能够熟练使用语言的基本语法和常见的数据结构与算法库。 6. 系统与网络知识:了解计算机系统的基本原理、操作系统的相关知识,并具备网络编程的基础知识。 以上是CSP竞赛中较为重要的知识点,掌握这些知识点将有助于解决CSP竞赛中的各类问题。参赛者还需要通过大量的练习和实践,提高编程能力和解题能力,才能在竞赛中取得好成绩。 ### 回答2: CSP竞赛是中国计算机学会举办的全国性高中生计算机竞赛,对于参赛选手来说,掌握一些必备的知识点是非常重要的。 首先,算法和数据结构是CSP竞赛的基础知识。选手需要掌握常见的排序算法(如冒泡排序、快速排序)、查找算法(如二分查找)和图算法(如最短路径算法、最小生成树算法)。此外,还需了解常见的数据结构,如数组、链表、栈、队列和树等。 其次,编程语言是参赛选手必备的工具。CSP竞赛使用C/C++和Pascal两种编程语言作为主力语言。选手需要熟悉这两种语言的语法和基本操作,掌握输入输出、变量和表达式等基本概念。 另外,数学基础知识也是CSP竞赛的重要组成部分。选手需要掌握数论、概率论和组合数学等基本概念,了解常见的数学运算和算法(如快速幂算法、最大公约数算法)等。 此外,选手还需熟悉计算机的基本原理和操作系统的基本知识,如二进制表示、计算机组成原理、进程和线程等。 最后,解题技巧和实践经验也是非常重要的。选手需要多做一些练习题和模拟赛,摸索出适合自己的解题方法,提升解题速度和准确性。 总之,CSP竞赛的必备知识点主要包括算法和数据结构、编程语言、数学基础、计算机原理和操作系统知识,以及解题技巧和实践经验。只有全面掌握这些知识,才能在竞赛中取得好的成绩。 ### 回答3: CSP竞赛是中国的计算机科学与技术竞赛,它对参赛者在算法设计与实现、数据结构、图论、动态规划等方面的知识要求较高。以下是CSP竞赛的必备知识点。 首先是算法设计与实现。参赛者需要了解各种基础算法,如贪心算法、分治算法、回溯算法、动态规划等,并能够熟练运用这些算法解决问题。此外,对于一些高级算法,如最大流、最小生成树、拓扑排序等,也需要有一定的了解。 其次是数据结构。CSP竞赛中经常需要用到的数据结构包括数组、链表、栈、队列、堆、树、图等。参赛者需要熟悉这些数据结构的特点、操作以及应用场景,能够灵活选择合适的数据结构解决问题。 图论也是CSP竞赛的必备知识点之一。参赛者需要了解图的基本概念,熟悉常用的图算法,如深度优先搜索、广度优先搜索、最短路径算法等。此外,对于一些高级的图论算法,如最小生成树算法、最大流算法、二分图匹配算法等,也需要有一定的了解。 动态规划是CSP竞赛中常用的解题方法。参赛者需要了解动态规划的基本原理、使用方法以及相关的优化技巧。能够通过推导状态转移方程、设计合适的状态表示和初始条件,从而优化问题的求解过程。 最后,参赛者还需要具备编程能力和解题思维。熟练掌握一门编程语言(如C++、Java等),能够使用编程语言实现算法,并能够分析问题、提炼问题的本质,找到解题的思路和方法。 以上是CSP竞赛的必备知识点,参赛者需要在这些方面进行深入学习和实践,以提高自己的竞赛水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值