快速幂
怎样快速求b^p 呢?
很简单:
b*b*b*……*bb?b?b?……?b (共p个b)
时间复杂度O(p)
傻子都能想到要超时,不然题目怎么会是快速幂呢?
哈哈哈!
不容易想到:
b^p 有以下几种可能:(m∈Z+)
p=2*m(p是偶数) ,那么b^p=(b^m)^2
p=2*m+1(p是奇数) ,那么b^p=(b^m)^2*b
∵(b^p/2)^2=b^p
是不是很简单呢?时间复杂度仅 O(log?N)!
1 #include <bits/stdc++.h> 2 using namespace std; 3 int I_love_cnblogs(long long b,long long p,long long k){ 4 long long result=1; 5 while (p){ 6 if (p%2) result=result*b%k; 7 b=b*b%k; 8 p/=2; 9 } 10 return result; 11 } 12 int main(){ 13 long long b,p,k;//数据可能过大 14 cin>>b>>p>>k; 15 printf("%d^%d mod %d=",b,p,k); 16 cout<<I_love_cnblogs(b,p,k); 17 return 0; 18 }