这个代码,是二分法求幂取模的优化算法。
其实代码真没什么复杂,难以理解的是算法。
t^n = t^(n/2) *t^(n-n/2);
由于:
(A * B) % M = ( (A % M) * (B % M) )%M
所以求a的模M幂也可以这样求:
(t^n)%M = ((t^(n/2)%M) * (t^(n-n/2)%M))%M
由于n/2与n-n/2相比可能相等(n为偶数)也可能多1(n为奇数)
进一步优化结果就是:
x = t ^ (n/2) %M
y = x * x % M;
如果n为奇数:y = y * t % M
这里理解比较困难的,就是n>>=1,其实就是将n作为二进制数,每次都n/2的意思。
你应该还少了scanf 吧?缺少了对a,n,和m的输入这个程序不会返回结果的。
while(n)-->指的是当n的值不为零时执行下面的语句,所以必须要输入n的值,如:scanf("%d",&n);
if(n%2==1)-->当n与2的模等于1时执行下面花括号里面的语句
res*=tmp-->指的是res=res*tmp,也就是一个乘法运算,
res%=m-->指的是tmp=tmp%m,是一个求余的赋值语句,和上面没有多大区别,
n>>=1-->指的是n=n>>1,将n的二进制向右位移(先化为二进制再位移),再化为十进制,就变成了 n的新的值。
return res-->返回res的值