A^B mod C

#include<stdio.h>  
 
unsigned long long mul(unsigned long long a,unsigned long long b,unsigned long long c)  
{  
    unsigned long long ret=0,tmp=a%c;  
    while(b)  
    {  
        if(b&0x1)  
            if((ret+=tmp)>=c)  
                ret-=c;  
            if((tmp<<=1)>=c)  
                tmp-=c;  
            b>>=1;  
    }   
    return ret;  
}  
 
 
unsigned long long mod(unsigned long long a,unsigned long long b,unsigned long long c)   
{   
   unsigned long long y=1;   
   while(b)   
   {   
      if(b&1)   
        y=mul(y,a,c);   
      a=mul(a,a,c);   
      b=b>>1;   
   }   
   return y;   
}  
 
int main()   
{   
   unsigned long long a,b,c;   
   while(scanf("%llu%llu%llu",&a,&b,&c)!=EOF)  
       printf("%llu/n",mod(a,b,c));   
   return 0;   
}

思路:例如2^10 ->  4^5 ->  4*16^2  上面的y就是记录这个本来会少乘的4,边求边mod;

数较大的话会溢出,在编写一个相乘的算法,防止溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值