FOJ1650-A^B mod C解题报告

来源:互联网 发布:python 调用c dll 编辑:程序博客网 时间:2024/06/05 17:05

新浪博客 发表时间 --2009-07-26 20:11:01

                                A^B mod C

题解:

解法一:可套公式,A*B mod C=((A mod C)*(B mod C) mod C ;A^B mod C=(A mod C)^(B mod C) mod C。

数据如果过大,则要考虑其他方法,此题的解法用到了逐次平方法(幂模运算)。具体实现过程参考数论相关的书籍。

 

需要注意的是,要小心溢出问题,比如a=a*b%c,如果简单这样计算的时候,如果a足够大的时候,就会导致溢出,处理方法为取a二进制值第一位乘以b与c模算加上a右移一位与相乘再和c做模运算后的值左移一位相加,再将相加的值和c做模运算,递归此过程,过程结束标志为a=0。

代码:


#include<stdio.h>


unsigned long long mul(unsigned long long a,unsigned long long b,unsigned long long c)
{
unsigned long long int a1=a,b1=b,c1=c;

if(!a1)
   return 0;
    return (((a1&1)*b1)%c1+(mul(a1>>1,b1,c1)<<1)%c1)%c1;
}

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%2==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)%c);
   return 0;
}

解法二:

   当数很大时比如快接近2的63次方时,解法一就不行,会溢出。要不溢出就得改变下解法一的mul函数,具体改变如下:

      

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;
}

这个函数是网上找的,现在是看不懂,研究中....

解法三:

代码:

#include "stdio.h"
int power(int a,int b,int c)
{
 int tmp;
 if (b==0)
 {
  return 1;
 }
 tmp=power((a*a)%c,b/2,c);
 if (b%2!=0)
 {
  tmp=(tmp*a)%c;
 }
 return tmp;
}
int main()
{
 int a,b,c;
 while(scanf("%d %d %d",&a,&b,&c)!=EOF)
 {
  printf("%d\n",power(a,b,c));
 }
}

原创粉丝点击