快速幂

关于快速幂的解释详见

https://www.jianshu.com/p/ec0b97676c3e

https://www.cnblogs.com/sun-of-Ice/p/9330352.html

 

个人代码:

const int p=100003;
long long fastmi(long long a,long long b){
    long long ans=1,bose=a;
    while(b>0){
        if(b&1==1)
            ans=ans*bose;
        bose=bose*bose;
        b>>=1;
    }
    return ans;

 

 

如果题目中出现快速幂加上取余操作,那么题目中的数据量可能会非常庞大,在这种情况下减少时间和空间的操作就显得非常重要了。

解决方法是

1、所有的数据均使用long long操作

2、每一步进行多乘操作时均进行取余操作。(减小空间,防止long long承受不下)

3、二进制操作(二进制操作可以有效减少时间)

 

在这种方法下的时间复杂度是O(logn),可以说是很小了。

 

列出个人代码

#include<iostream>

using namespace std;

long long p;

long long fastmi(long long a,long long b){

long long ans=1,bose=a;

while(b>0){

if(b&1==1)

ans=ans*bose%p;

bose=bose*bose%p;

b>>=1;

}

return ans;

}

int main(){

long long m,n,endd;

cin>>m>>n>>p;

    endd=fastmi(m,n);

    if(m==1&&n==0&&p==1)               //这一步是周全特殊情况的讨论

    endd=0;                     

    cout<<m<<"^"<<n<<" mod "<<p<<"="<<endd<<endl;

return 0;

} 

 

posted @ 2020-06-16 08:23  aerovnane  阅读(306)  评论(0)    收藏  举报