当前位置: 首页 > news >正文

如何做网站内容管理/百度权重查询工具

如何做网站内容管理,百度权重查询工具,企业网站建设模板多少钱,长春生物新冠疫苗快速幂 引题&#xff1a;现有两个整数m、n&#xff0c;求mnm^nmn除以1000000007之后的余数。输入&#xff1a;输入整数m、n&#xff0c;用1个空格隔开&#xff0c;占1行。输出&#xff1a;输出mnm^nmn除以1000000007之后的余数&#xff0c;占1行。限制&#xff1a;1<m<10…

快速幂

引题:现有两个整数m、n,求mnm^nmn除以1000000007之后的余数。
输入:输入整数m、n,用1个空格隔开,占1行。
输出:输出mnm^nmn除以1000000007之后的余数,占1行。
限制1&lt;=m&lt;=1001&lt;=m&lt;=1001<=m<=1001&lt;=n&lt;=1091&lt;=n&lt;=10^91<=n<=109
输入示例:5 8
输出实例:390625

1. 解决算法复杂度问题

如果用最直接的方法求xnx^nxn,我们需要进行n-1吃乘法运算,算法复杂度为O(n)。
不过,x的幂乘可以利用xn=(x2)n2x^n=(x^2)^\frac{n}{2}xn=(x2)2n的性质,用反复平方法快速求出。
该算法可以通过下面的递归函数实现:
pow(x,n)={1(n=0时)pow(x2,n/2)(n为偶数时)pow(x2,n/2)∗x(n为奇数时)pow(x,n)=\begin{cases}1&amp;(n=0时)\\pow(x^2,n/2)&amp;(n为偶数时)\\pow(x^2,n/2)*x&amp;(n为奇数时)\end{cases}pow(x,n)=1pow(x2,n/2)pow(x2,n/2)xn=0nn

举个例子,3213^{21}321展开之后如下所示:

321=(3∗3)10∗3=910∗3=(9∗9)5∗3=815∗3=(81∗81)2∗81∗3=65612∗81∗3=(6561∗6561)1∗81∗33^{21}\\=(3*3)^{10}*3=9^{10}*3\\=(9*9)^5*3=81^5*3\\=(81*81)^2*81*3=6561^2*81*3\\=(6561*6561)^1*81*3321=(33)103=9103=(99)53=8153=(8181)2813=65612813=(65616561)1813

这样的话乘法运算的次数就从20次减少到了6次。只要算3 * 3,9 * 9,81 * 81,6561 * 6561以及多出的 *81和 *3,这六次乘法运算就可以。

似乎根据上面的分析我们可以得出代码:

int power(int a, int b)
{int ans = 1;while( b>0 ) {if( b&1 ) ans = ans*a; //当b为奇数时,乘以余下的一个ab >>= 1;//位运算,右移1位,相当于除以2a = a*a;}return ans;
}

这样,递归函数的参数n逐次减半,因此算法复杂度为O(logn)。

2. 解决取模运算问题

在遇到“求某计算结果除以M(本题中式1000000007)之后的余数”这类题时,可以按下述方法计算(这里a除以b之后的余数记作a%b)。

  1. 计算加法时,每相加一次执行一次%M
  2. 计算减法时,给被减数加上M之后,先算减法,后算%M
  3. 计算乘法时,每相乘一次执行一次%M

关于计算乘法时的公式:(a∗b)%M=(a%M)∗(b%M)(a*b)\%M=(a\%M)*(b\%M)(ab)%M=(a%M)(b%M)
证明:
设a除以M的余数和商分别为ar、aq,
b除以M的余数和商分别为br、bq,
即a/M=aq……ar,
b/M=bq……br,

则有:
a∗b=(aq∗M+ar)∗(bq∗M+br)=aq∗bq∗M2+ar∗bq∗M+aq∗br∗M+ar∗br=(aq∗bq∗M+ar∗bq+aq∗br)∗M+ar∗bra*b\\=(aq*M+ar)*(bq*M+br)\\=aq*bq*M^2+ar*bq*M+aq*br*M+ar*br\\=(aq*bq*M+ar*bq+aq*br)*M+ar*brab=(aqM+ar)(bqM+br)=aqbqM2+arbqM+aqbrM+arbr=(aqbqM+arbq+aqbr)M+arbr
即易得:
(a∗b)%M=ar∗br=(a%M)∗(b%M)(a*b)\%M=ar*br=(a\%M)*(b\%M)(ab)%M=arbr=(a%M)(b%M)

类似可以得出:(a∗b)%M=[(a%M)∗(b%M)]%M(a*b)\%M=[(a\%M)*(b\%M)]\%M(ab)%M=[(a%M)(b%M)]%M
(引理1:积的取余等于取余的积的取余。)

公式:ab%M=(a%M)b%Ma^b\%M=(a\%M)^b\%Mab%M=(a%M)b%M
证明:
(a%M)b%M=[(a∗1)%M]b%M={[(a%M)∗(1%M)]%M}b%M=[(a%M)%M]b%M(a\%M)^b\%M\\= [(a*1)\%M]^b\%M\\=\{[(a\%M)*(1\%M)]\%M\}^b\%M\\=[(a\%M)\%M]^b\%M(a%M)b%M=[(a1)%M]b%M={[(a%M)(1%M)]%M}b%M=[(a%M)%M]b%M
由上面公式迭代:
[(a%M)b]%M=ab%M[(a\%M)^b]\%M=a^b\%M[(a%M)b]%M=ab%M

因此,解决了上述两个问题,我们就可以实现快速幂的算法代码了:

#include <iostream>
#define LL long long
using namespace std;
const LL mod=1e9+7;LL ksm(LL a,LL b)//快速幂
{LL ans = 1;a %= mod;while( b>0 ){if( b&1 ) ans = (ans*a)%mod;b >>= 1;//位运算,右移1位,相当于除以2a = (a*a)%mod;}return ans;
}

同理,易得快速乘的算法:
快速乘主要用于防止有两个较大的数相乘而直接乘爆, 因为是加法, 怎么都不可能加爆.,所以目的就是为了防止爆范围。

#include <iostream>
#define LL long long
using namespace std;
const LL mod=1e9+7;LL ksc(LL a,LL b)//快速乘,计算a*b%mod
{LL ans = 0;a %= mod;while( b>0 ){if( b&1 ) ans = (ans+a)%mod;b >>= 1;//位运算,右移1位,相当于除以2a = (a+a)%mod;}return ans;
}

转载于:https://www.cnblogs.com/yuzilan/p/10626082.html

http://www.lbrq.cn/news/1298827.html

相关文章:

  • 网站制作书籍/百度官方客户端
  • 网站开发的最后5个阶段/如何在google上免费推广
  • 长沙建网站联系电话/东莞外贸优化公司
  • 物流网站前端模板下载/知名网络营销推广
  • 衢州高级网站设计/微信搜一搜seo优化
  • 个人可以做几个网站吗/淘宝推广怎么推
  • 浙江省建设工程质量管理协会网站/泰州seo
  • 在网站做网管工作都做什么/百度竞价推广怎么收费
  • 电商型企业网站建设/济南seo全网营销
  • 做网站有前景吗/泰安seo推广
  • 山东房和城乡建设厅网站首页/网络推广工具
  • 苏州网站建设布局/seo产品是什么意思
  • 长沙知名网站/网络营销推广渠道有哪些
  • 大连模板做网站/建立自己的网站
  • 建立网站一般包括什么等方式/网站建设推广服务
  • 企业网站开发实训目的/电商平台推广方案
  • cms做网站不用后端/中国互联网协会
  • 东莞品托网站建设/济南网络推广公司电话
  • 广告交流群/北京网络seo推广公司
  • 北京计算机培训机构排名前十/太原优化排名推广
  • 杭州关键词排名提升/国外seo网站
  • 网站退出率是什么意思/百度一下搜索一下
  • 网站建设与管理资料下载/山东网络优化公司排名
  • 传销公司做网站运营/软文形式推广产品
  • 广州网络建站/网站建设高端公司
  • 搜索不到的网站/做网站
  • 网站产品管理模块/seo工资待遇 seo工资多少
  • 延安网站建设/seo是指什么职位
  • 网站如何改字体/市场营销案例100例
  • 做网站要准备的资料/营销策略是什么意思
  • 商业秘密视域下计算机软件的多重保护困境
  • GaussDB union 的用法
  • Java从入门到精通:全面学习路线指南
  • 解决Maven版本不兼容问题的终极方案
  • 定时器中BDTR死区时间和刹车功能配置
  • spring boot 实战之分布式锁