我知道计算(X ^ Y)%M。现在我的问题是假设我们需要最大化(X ^ i)%M,其中我可以在0到Y和M = 10 ^ 9 +之间变化。什么可以我说iI意味着什么时候最大?
输入将包含X和Y,它可以达到10 ^ 100,我可以通过使用JAVA的BigIntegers或在c ++中使用模块化算法来处理。
答案 0 :(得分:0)
你应该做的第一件事就是转移
X=X%M
Y=Y%M
注意,10 9 +7远小于10 100 。因此,您不需要大于long
的数字。对于中间结果,您将需要很长时间。
您应该依次计算X i :
power[0]=X;
long i;
for(i=1; i<Y; i++){
power[i]=(power[i-1]*X)%M;
if (power[i] is in power[0..i-1]) {
i--;
break;
}
}
find max power[0..i];
因为他们会经常重复。
但我不知道10 9 +7是否为素数。如果是,则在达到10 9 +7以下的所有数字之前不会重复。唯一的变化是每10个 9 +7以下的X将设置自己独特的数字重组1..10 9 +7。
在这种情况下,高于10 9 +7的每个Y的最大值将是10 9 + 7-1。至于较小的Y,你必须经常检查,而不检查重复。