为什么要用快速乘
对于快速乘,相信很多人还是有许多疑惑的,像刚接触这个知识点的我一样,明明已知三个数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;
}
以上就是完整代码了,是不是很简单。