private static int process(int a, int b, int p) {
int ans = 1 % p;
while (b > 0) {
if ((b & 1) == 1) {
ans = (int)((ans * 1L * a) % p);
}
a = (int)((a * 1L * a) % p);
b = b >> 1;
}
return ans;
}
private int qmi(int a, int b, int p) {
int ans = 1 % p;
while (b > 0) {
if ((b & 1) == 1) {
ans = Math.floorMod(ans * 1L * a, p);
}
a = Math.floorMod(a * 1L * a, p);
b = b >> 1;
}
return ans;
}
怎么感觉类似于二进制优化
感觉这个没必要
这个地方直接用m不行吗,为什么还要int t=m,这不是多此一举吗
我也想知道😂
···
1 % p 的意义是什么
···
考虑了p=1时结果为零的情况
…那还需要算吗,p = 1 结果不永远都是0吗
res就是用1%p来进行初始化的,刚好就保证了结果可以是0
我认为这样写代码看上去简介吧,其实也可以上来就判断p是否为1,为1的话直接return 0;
怎么感觉是防溢出呢?p=10^9+7 (看大神其他的有提到
如果考虑 a b 为负数的话,显然使用 Math.floorMod 更为合适。
不想写 Math.floorMod 的也可以这样写:
Java 考虑溢出的模板
Java 模板应该是这个,我自己测了没问题,至少在int范围内没问题。
求 $m^k \bmod p$,时间复杂度 $O(logk)$
棒!看起来没啥问题~
k ==0 时 mod 1 的情况没有讨论
已改~
会返回0呀!