privatestaticintprocess(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;
}
privateintqmi(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;
}
怎么感觉类似于二进制优化
t=m;
感觉这个没必要
这个地方直接用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 的也可以这样写:
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; }
Java 考虑溢出的模板
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; }
Java 模板应该是这个,我自己测了没问题,至少在int范围内没问题。
求 mkmod,时间复杂度 O(logk)
public int qmi(int m, int k, int p){ int res = 1, t = m; while(k > 0){ if( (k&1) == 1){ res = res * t % p; } t = t * t % p; k = k>>1; } return res; }
棒!看起来没啥问题~
k ==0 时 mod 1 的情况没有讨论
已改~
会返回0呀!