快速幂----快速求解底数的n次幂
创始人
2024-05-29 15:05:00
0

目录

一.快速幂

1.问题的引入

2.快速幂的介绍

3.核心思想

4.代码实现

 2.猴子碰撞的方法数

1.题目描述

2.问题分析

3.代码实现


一.快速幂

1.问题的引入

问题:求解num的n次幂,结果需要求余10^9+7

对于这个问题我们可能就是直接调用函数pow(a,b)来直接求解a的b次幂问题,但是如果求解的结果很大,超过的double的数值范围,我们要求对最终的结果求余10^9+7,我们如果直接调用pow()函数的话,求解出来的数已经超出了double的最大范围,根本无法求出,这个时候我们是否可以考虑在求解的过程中每一次的结果都求余10^9+7,而不是只在最终的结果求余10^9+7这样最终的结果肯定是小于10^9+7,一定不会超出最大的范围.

2.快速幂的介绍

快速幂:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N),与朴素的O(N)相比效率有了极大的提高。

3.核心思想

例如计算3^{^{10}},10的二进制为1010,相当于求解3^{1010}次方

3^{^{10}}=3*3*3*3*3*3*3*3*3*3

=(3*3)*(3*3*3*3*3*3*3*3)

=3^{2}*3^{8}

相当于我们每次对10的二进制的每一个位置求权(如果是二进制这个位是1),则乘以当前的叠加的数,

例如进行求余3^{^{10}}的步骤 :

定义变量ans保存3^{^{10}}的结果   1010位10的二进制表达方式

1010的第一位为0,这个时候num=num*num=3^{2};    二进制形式为:3^{0010}

1010的第二位为0,这个时候求权为1,ans=ans*num=3^{2}  num=num*num=3^{4};二进制形式为:3^{0100}

1010的第三位为0,这个时候num=num*num=3^{8}; 二进制形式为:3^{1000}

1010的第四位为1,这个时候求权为1,ans=ans*num=3^{2}*3^{8}  num=num*num=3^{16};

4.代码实现

1.求余10^9+7的版本,返回数据类型为int的结果

    public int quickPow(long num,int n){long ans=1;long mod=1000000007;while(n!=0){if((n&1)==1)ans=(ans*num)%mod;num = num * num % mod;n>>=1;}return (int)(ans%mod);}

 2.不求余的版本,返回数据类型为long的结果

    public long quickPow(long num,int n){long ans=1;while(n!=0){if((n&1)==1)ans=ans*num;num = num * num;n>>=1;}return ans;}

 2.猴子碰撞的方法数

1.题目描述

现在有一个正凸多边形,其上共有 n 个顶点。顶点按顺时针方向从 0n - 1 依次编号。每个顶点上 正好有一只猴子 。下图中是一个 6 个顶点的凸多边形。

 

每个猴子同时移动到相邻的顶点。顶点 i 的相邻顶点可以是:

  • 顺时针方向的顶点 (i + 1) % n ,或
  • 逆时针方向的顶点 (i - 1 + n) % n

如果移动后至少有两个猴子位于同一顶点,则会发生 碰撞

返回猴子至少发生 一次碰撞 的移动方法数。由于答案可能非常大,请返回对 109+7 取余后的结果。

注意,每只猴子只能移动一次。

力扣: 力扣

2.问题分析

正难则反,题目问的是至少发生一次碰撞的移动次数,我们不妨把问题转换为求解猴子一次都不碰撞的次数,猴子一共有2的n次幂中跳跃的方式,求中有两种是一次都不碰撞的,一种是猴子全部顺时针进行跳跃,一种是猴子逆时针进行跳跃,所以猴子至少发生一次碰撞的次数=猴子总共的移动次数-2

3.代码实现

    public int monkeyMove(int n) {long ans=1,a=2;long mod=1000000007;while(n!=0){if((n&1)==1)ans=(ans*a)%mod;a = a * a % mod;n>>=1;}return (int)((ans+mod-2)%mod);}

 

 

相关内容

热门资讯

热点推荐“贝众乐游到底有没有透... 热点推荐“贝众乐游到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“88娱乐城到底有没有... 热点推荐“88娱乐城到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获...
热点推荐“传奇德州到底有没有透... 您好,传奇德州这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
热点推荐“精品乐清麻将到底有没... 热点推荐“精品乐清麻将到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”...
热点推荐“湘叶娱乐到底有没有透... 热点推荐“湘叶娱乐到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“新友茶社到底有没有透... 您好,新友茶社这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
热点推荐“网上斗牛到底有没有透... 亲,网上斗牛这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,网上斗牛的开挂软件,名...
热点推荐“雀悦诏安麻将到底有没... 雀悦诏安麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“棋牌室到底有没有透视... 您好:棋牌室确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现...
热点推荐“微友联盟到底有没有透... 亲,微友联盟这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,微友联盟的开挂软件,名...
热点推荐“众联到底有没有透视挂... 热点推荐“众联到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能够完...
热点推荐“雀神麻将到底有没有透... 热点推荐“雀神麻将到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“越记乡游到底有没有透... 热点推荐“越记乡游到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获取...
热点推荐“麻友圈2贵州麻将到底... 您好:麻友圈2贵州麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打...
热点推荐“乐天棋牌到底有没有透... 热点推荐“乐天棋牌到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“海星到底有没有透视挂... 您好:海星确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现很...
热点推荐“潮汕馆到底有没有透视... 您好:潮汕馆确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现...
热点推荐“乐享贵州麻将到底有没... 乐享贵州麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“汇友娱乐到底有没有透... 您好:汇友娱乐确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“hhpoker脚本到... 热点推荐“hhpoker脚本到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的...