则么做有三个条件:
- 所有的运算数都不超过long long范围,
- 不能有除法
- 有
m
o
d
mod
mod运算
(
就是有
n
%
m
)
(\text{就是有}n\%m)
(就是有n%m)
看好了到时候错了 别怪我!!!
就拿一个经典的题来说吧,告诉你
a
,
b
,
m
a,b,m
a,b,m求
a
b
m
o
d
m
a^b\ mod\ m
ab mod m都不超过long long 范围
正常的思路:
int a,b,m;
cin >> a >> b >> m;
int s=0;
for(long long i = 1; i <= b; i++)
{
s*=a;/*!!!*/
}
cout << s%m;
我标记了!!!的地方第二次循环的时候肯定会爆
这时候有一句很有用的话:
只要一个算式中没有除法,并且需要最后取余n,那么你可以在这个算式中塞满取余n,比如(1+1*3)%2可以变成
[1%2+(1%2*3%2)%2]%2
所以上面的代码可以变成
int a,b,m;
cin >> a >> b >> m;
int s=0;
for(long long i = 1; i <= b; i++)
{
s=a%m*s;
}
cout << s%m;