最大公约数&&快速幂模板

来源:互联网 发布:易云数据vps 编辑:程序博客网 时间:2024/06/07 04:46

快速幂算法:

求a的b次方模c,如果b是偶数,就相当于求  a的平方    的二分之b次方   模c;

如果b是奇数,就在上面的基础上再乘以a   模c;即a的平方的二分之b 次方  乘以a  模c;

由此可以得到算法4:

算法4

int ans = 1;

a = a % c;

if(b%2==1)

ans = (ans * a) mod c; //如果是奇数,要多求一步,可以提前算到ans

k = (a*a) % c; 

for(int i = 1;i<=b/2;i++)

ans = (ans * k) % c;

ans = ans % c;

对于奇数的情形会多出一项a mod c,所以当b是奇数时,我们通过ans = (ans * a) % c;来弥补多出来的这一项

最终的模板:

int ans = 1;

a = a % c;

while(b>0)

{

if(b % 2 == 1)

ans = (ans * a) % c;

b = b/2;

a = (a * a) % c;

}


最大公约数(1)

int gcd(int a, int b) 

   return a%b == 0?b:gcd(b,a%b);  

}

最大公约数(2)

 intmax(int x,int y)

 {

     inttemp;

      if(x<y)

      {

         temp=x;x=y;y=temp;

      }

     while(y!=0)

     {

        temp=x%y;

        x=y;

        y=temp;

     }

     return(x);

 }

最大公约数(3)

int A(int a,int b)
{
    return b==0?a:A(b,a%b);
}

最小公倍数

 intmin(int x,int y)

 {

     intmax(int x,int y);

    inttemp;

    temp=max(x,y);

     return(x*y/temp);

 }

 快速幂

int PowerMod(int a,int b,int c)

{

    int ans = 1;

   a = a % c;

    while(b>0) {

       if(b % 2 = = 1)

       ans = (ans * a) % c;

       b = b/2;

       a = (a * a) % c;

   }

    return ans;

}

最小公倍数:

int f(int a, int b)
{
    int i;
    for(i=a; ;i=i+a)
    {
        if(i%b==0)
        return i;
    }
}


2 0
原创粉丝点击