快速乘的分析与运用

为什么要用快速乘
对于快速乘,相信很多人还是有许多疑惑的,像刚接触这个知识点的我一样,明明已知三个数a,b,c。求a*b%c直接一行代码就解决问题了,为什么还需要这呢?
所以怀着这个想法直接提交快速乘的题目,答案老是会错50%,为什么?因为所给的数据相乘后可能会爆long long,而快速乘则不会;这就是为什么我们需要用到快速乘了。
快速乘的讲析
对于三个数a,b,c。求a * b%c;
我们可以先求出z=a/c *b;
然后我们就可以转换一下,对于求a *b%c;我们就可以求res=a *b-z *c;
因为是取模嘛,所以我求出a乘b中有多少个c;z就是c的数量,然后用a乘b减去z乘c就达到了我们取模的目的。
为什么这么做?
这时候我们就要用到一种数据类型unsigned long long,这种数据类型会在存满后自动变为零,又因为我们用的是减法,所以对最后的结果不影响。
经过一番讲析之后,我们就可以上代码了。

#include<stdio.h>
long long int a,b,c,sum;
long long  ksc(long long  x,long long  y,long long  p)
{
    long long z=(long double)x/p*y;
    long long res=(unsigned long long)x*y-(unsigned long long)z*p;
    return res;
}
int main()
{
  while(~scanf("%lld%lld%lld",&a,&b,&c))
	 {
	  sum=ksc(a,b,c);
	  printf("%lld\n",sum);
	 }
		return 0; 
} 

以上就是完整代码了,是不是很简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值