如何减少后续循环的时间复杂度?

时间:2018-04-11 06:45:57

标签: c math time-complexity modulo

for(i=0;i<N-2;i++)
       count=(count*10)%M;

这里,N可以高达10 ^ 18,M是(10 ^ 9 +7)。由于此循环需要执行O(n)时间,因此我在代码中获得了TLE。有什么方法可以减少时间复杂度?

1 个答案:

答案 0 :(得分:3)

问题基本上是:

  

(count * a ^ b)%mod =((count%mod)*((a ^ b)%mod))%mod

a = 10,b = 10 ^ 18

你可以使用:

找到((a ^ b)%mod)
long long power(long long x, long long y, long long p)
{
    long long res = 1;      // Initialize result

    x = x % p;  // Update x if it is more than or 
                // equal to p

    while (y > 0)
    {
        // If y is odd, multiply x with result
        if (y & 1)
            res = (res*x) % p;

        // y must be even now
        y = y>>1; // y = y/2
        x = (x*x) % p;  
    }
    return res;
}

时间功能函数的复杂度为O(log y)。

在你的情况下,count是一个1位数的数字,所以我们可以简单地将它与(count%mod)相乘,最后得到mod的结果。如果count也是一个很大的数字,并且可能导致溢出,那么我们可以这样做:

long long mulmod(long long a, long long b, long long mod)
{
    long long res = 0; // Initialize result
    a = a % mod;
    while (b > 0)
    {
        // If b is odd, add 'a' to result
        if (b % 2 == 1)
            res = (res + a) % mod;

        // Multiply 'a' with 2
        a = (a * 2) % mod;

        // Divide b by 2
        b /= 2;
    }

    // Return result
    return res % mod;
}