快速幂算法:
求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;
}
}