快速幂:a*b%p和a^b%p

快速幂:a*b%p和a^b%p**

理解:所谓快速幂,就是解决大数运算的一种思想,更形象的理解为:位运算,而这个位是按二进制来看的位,比如 8 = 2^3 1+2^ 2 0+2^ 10+2^00;即按二进制表示为:1000
还可以理解 7634%5 =(76%5)*(34%5)%5 只是我们将其用了二进制来减少b,也就是循环次数,从而降低复杂度

【a^b%p】
在这里插入代码片

   long long int a,b,p;
   scanf("%lld %lld %lld",&a,&b,&p);
    long long int ans=1;
   while(b)
   {
       if(b%2==1) ans=ans*a%p;//如果是2的倍数,就把多的那个a乘到ans里
        a=a*a%p;
        b=b/2;//移到下一位,虽然b/2,但是我们的ans同时也再乘了个a,这里的b指的是乘     a的个数
   }
   printf("%lld",ans%p);

【a*b%p】

  long long int a,b,p,ans = 0;
    scanf("%lld\n%lld\n%lld",&a,&b,&p);
    while(b)
   {
       if(b%2==1) ans=(ans+a)%p;
       a=a*2%p;
       b/=2;
   }
   printf("%lld",ans);

你可能感兴趣的:(数论)