题目描述
求 a 乘 b 对 p 取模的值。
数据范围
1≤a,b,p≤10^18
样例
输入样例:
3
4
5
输出样例:
2
算法1
(二进制思想) $O(logn)$
如果直接计算a乘b这会超过 long long 的最大范围,所以采用类似于快速幂的思想
把 b写成二进制形式,然后如果某位上为1就加上它a*(2^n)次方(n与这位的位置有关)
并且每次计算后取模就可以了
例:计算 3*7
7的二进制 111
3*(2^0)=3
3*(2^1)=6
3*(2^2)=12
观察可发现每次的可由前一次*2推出(记得取模)
时间复杂度分析:logn
C++ 代码
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main()
{
ll a,b,p,res;
cin>>a>>b>>p;
res=0;
while(b)
{
if(b&1)
res=(res+a)%p;
b>>=1;
a=2*a%p;
}
cout<<res<<endl;
return 0;
}
就没人写高精度吗
我写了,不会取余,能看看大佬的代码吗
https://www.acwing.com/activity/content/code/content/3921964/
懂了,谢谢大佬
## 算法2
做乘法时转换为__int128,取模后转回 long long
代码:
1.高精度
2.128int
3.二进制思想
请问这个慢速乘,是专门用来解决爆long long的吗?有其他的应用吗?
很棒!
赞一下
谢谢啦,看了你的很多题解👍
6
留下一个思维深度极高的版本
666
直接Python不好吗:print(int(input())*int(input())%int(input()))
头像好评
tql orz
这样也不会出现超过long long的情况啊?如果a是一个很大的正整数,快到long long上界了,p也是快到long long上界了,此时运行a=2a%p;时2a也会出现超过long long吧,不知道我理解的对不对?
按照本题的数据范围,不会出现你说的情况。
哦哦,xiexie!
何不unsigned long long?
这个题目可以用高精度除法来做吗
可以
妙啊
tql
很不错的题解,对书中的相对基础而未涉及的知识有了介绍,赞!
赞
赞!
赞
赞