ACM第二周

一:快乘与快速幂
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此文只是个人见解,并不一定全部正确,如有错误欢迎批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值