码迷,mamicode.com
首页 > 其他好文 > 详细

快速乘

时间:2020-04-06 20:18:52      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:type   描述   sha   sharp   pac   clu   cin   name   a*   

题目描述
求 a 乘 b 对 p 取模的值,其中 1 <= a,b,p <= 10^18

输入描述:
第一行a,第二行b,第三行p。

输出描述:
一个整数,表示a * b mod p的值。

实例
输入: 2 3 9
输出: 6

思想
这道题是要先算出a*b再对其结果进行求模(取余),因为a和b的最大值为1e+18,我们知道乘法有的时候会溢出,即使是 longlong 也可能在乘法时爆掉。所以我们寻找一种能高效完成乘法操作并且不会爆 longlong 的算法,也就是快速乘。

代码原理
可以把 a * b这样算:
a * b = a + a + a + ...+ a

a * 1 = a
a * 2 = 2a
a * 4 = 4a
a * 8 = 8a
...
所以可以推出:
a * (2 ^ k) = 2 ^ k * a

 

 

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qmul(ll a,ll b,ll c)
{
	ll ans=0;
	ll temp=a;
	while(b)
	{
		if(b&1) ans=(ans+temp)%c;
		temp=(2*temp)%c;
		b>>=1;
	}
	return ans;
}
int main()
{
	long long a,b,c;
	cin>>a>>b>>c;
	long long ans=qmul(a,b,c);
	cout<<ans<<endl;
	
} 

  

快速乘

标签:type   描述   sha   sharp   pac   clu   cin   name   a*   

原文地址:https://www.cnblogs.com/Charls/p/12643860.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!