一:快乘与快速幂
ps:同余定理:
(a+b)%c=(a%c+b%c)%c
(a-b)%c=(a%c-b%c)%c
(a×b)%c=(a%c×b%c)%c
除法不行!(手动重点 手动重点)除法是另外的公式;
1.fastmul 快乘(任何数都能化成二进制)
eg:求(a×b)%c
int fastmul(int a,int b,int c)
{
int ans=0;
a=a%c;
while(b)
{
if(b%2)
{
ans=(ans%c+a%c)%c;
}
a=(a%c+a%c)%c;
b=b/2;
}
return ans%c;
}
此方法时间复杂度很小,主要思想就是把b化为二进制进而分解解题步骤;
2.fastpow 快速幂
eg:求a^b%c
int fastpow(int a,int b,int c)
{
int ans=1;a=a%c;
while(b)
{
if(b%2)
{
ans=(ans%c*a%c)%c;
}
a=(a%c*a%c)%c;
b=b/2;
}
return ans%c;
}
原理基本同上。
二:GCD(最大公约数求法)
ps:对于实数a,b,有
a=b×q1+r1
b=r1×q2+r2
r1=r2×q3+r3
… …
rn=r(n-1)×q(n+2);
由定理“(a,b)的最大公约数就相当于(b,r)的最大公约数”可得a b的最大公约数就是q(n-2);//
将以上思路化为代码:
GCD循环做法:
int main()
{
int a,b;
scanf("%d %d",&a,&b);
while(b)
{
int mid=a;
a=b;
b=mid%b;
}
printf("%d",a);
return 0;
}
GCD递归做法:
int GCD(int a,int b)
{
if(b==0)
return a;
GCD(b,a%b);
}
这方法,emmmmmm简单的一匹,这种方法所包含的思路很重要,阿基米德将一个抽象的问题分解成一个个小问题,进而约掉了一个变量。以后要将这种思路(或者说是思想)灵活运用到其他地方。
QAQ此文只是个人见解,并不一定全部正确,如有错误欢迎批评指正。