Python 关于模运算的行为?

Python 关于模运算的行为?,python,modulus,Python,Modulus,我用python为下面的codechef问题编写了以下程序 但是我的模函数不能正常工作,例如n=498 r=2 combo()返回的答案是0,因为q=243293343,r=1428355228 如何在arr[]中执行模运算以纠正此错误 找到了解决方案,回答了我自己的问题,但鼓励搜索优化版本 错误是 返回((q/r)%mod) mod为100000007是错误的,即素数,它必须写为 r=(arr[r]*arr[n-r])%mod 返回(q*功率(r,mod-2))%mod 幂函数是什么 def

我用python为下面的codechef问题编写了以下程序

但是我的模函数不能正常工作,例如n=498 r=2 combo()返回的答案是0,因为q=243293343,r=1428355228
如何在arr[]中执行模运算以纠正此错误

找到了解决方案,回答了我自己的问题,但鼓励搜索优化版本 错误是

返回((q/r)%mod)

mod为100000007是错误的,即素数,它必须写为

r=(arr[r]*arr[n-r])%mod

返回(q*功率(r,mod-2))%mod

幂函数是什么

def Power(base,expo):
if(expo==0):
  return 1
else:
    if(expo&1):
      return(base*Power(base,expo-1)%mod)
    else:
      root=Power(base,expo>>1)
      return(root*root%mod) 
但是,如果有人解释使用return(base*Power(base,expo-1)%mod)背后的数学原理,这将是非常有帮助的。当我们分割(a/b)%mod时,我们会这样做

(a/b)%MOD

(a*逆(b))%MOD//您必须找到b的逆。用费马定理求b的逆


注:永远不要将a/b除以,然后取MOD,首先求b的倒数,然后求a*b,然后对其进行MOD。

上面的幂函数使用所谓的平方幂运算来计算O(log(b))中的a^b。想法很简单:

       (a^2)^(b/2)          if b is even and b > 0
a^b =  a*(a^2)^((b-1)/2)    if b is odd
        1                  if b = 0
这个想法可以很容易地实现,如下所示:

/* This function calculates (a^b)%c */
int modulo(int a,int b,int c)
{
    long long x=1,y=a; 
    while(b > 0)
    {
        if(b%2 == 1)
        {
            x=(x*y)%c;
        }
        y = (y*y)%c; // squaring the base
        b /= 2;
    }
    return x%c;
}
上面的幂函数只是一种递归方法。 当你问起这件事的时候

但是,如果有人能解释一下使用return(base*Power(base,expo-1)%mod)背后的数学原理,那将大有裨益

这与检查expo是否为奇数相同,然后将base乘以base^(expo-1),这样新的expo即(expo-1)将变为偶数,并且可以重复平方

有关更多信息,请参阅:

/* This function calculates (a^b)%c */
int modulo(int a,int b,int c)
{
    long long x=1,y=a; 
    while(b > 0)
    {
        if(b%2 == 1)
        {
            x=(x*y)%c;
        }
        y = (y*y)%c; // squaring the base
        b /= 2;
    }
    return x%c;
}