快速幂
关于快速幂的解释详见
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; }

浙公网安备 33010602011771号