a^16 = (a^8)^2 = ((a^4)^2)^2 = (((a^2)^2)^2)^2
循环16次 vs 循环3次
比如:
a^26 = a^16 * a^8 *a^2=(((a^2)^2)^2)^2 + ((a^2)^2)^2 + (a^2)
26 =16+8+2
26的二进制为11010
11010&1 = 0 a ans=1 11010>>1 --> 1101 1101&1 = 1 a^2 ans*=a^2 1101>>1 --> 110 110&1 = 0 a^4 110>>1 --> 11 11&1 = 1 a^8 ans*=a^8 11>>1 --> 1 1&1 = 1 a^16 ans*=a^16 1>>1 -->0
a^b mod b做法
#include<iostream> #include<cstdio> using namespace std; #define ll long long int main(){ ll a,b,p; scanf("%lld %lld %lld",&a,&b,&p); int ans=1; while(b){ if(b&1) ans = ans*a%p; //当b的最后一位为1 ,则将此时的a乘上 b>>=1; //每次b向右移动一位,表示整除2 a=a*a%p; //每次让a翻倍 } printf("%lld",ans%p); return 0; }