📌  相关文章
📜  找到 XXXX 的值…..(N 次) % M 其中 N 很大

📅  最后修改于: 2021-09-16 11:01:23             🧑  作者: Mango

给定三个整数XNM 。任务是找到XXX…(N 次) % M其中X可以是范围[1, 9] 中的任何数字。

例子:

方法:该问题可以使用分而治之的技术来解决。可以轻松计算 X、XX、XXX 等较小数字的模数。但问题出现在更大的数字上。因此,该数字可以拆分如下:

  1. 如果N 是偶数-> XXX…(N 次) = (XXX…(N/2 次) * 10 N/2 ) + XXX..(N/2 次)。
  2. 如果N 是奇数-> XXX…(N 次) = (XXX…(N/2 次) * 10 (N/2)+1 ) + (XXX…(N/2 次) * 10) + X。

通过使用上面的公式,数字被分成更小的部分,可以很容易地找到其模运算。使用属性(a + b) % m = (a % m + b % m) % m ,递归分治解法使用较小数字的结果找到较大数字的模数。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Iterative function to calculate
// (x ^ y) % p in O(log y)
int power(int x, unsigned int y, int p)
{
 
    // Initialize result
    int res = 1;
 
    // Update x if it is >= p
    x = x % 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 / 2
        y = y >> 1;
        x = (x * x) % p;
    }
    return res;
}
 
// Function to return XXX.....(N times) % M
int findModuloByM(int X, int N, int M)
{
 
    // Return the mod by M of smaller numbers
    if (N < 6) {
 
        // Creating a string of N X's
        string temp(N, (char)(48 + X));
 
        // Converting the string to int
        // and calculating the modulo
        int res = stoi(temp) % M;
 
        return res;
    }
 
    // Checking the parity of N
    if (N % 2 == 0) {
 
        // Dividing the number into equal half
        int half = findModuloByM(X, N / 2, M) % M;
 
        // Utilizing the formula for even N
        int res = (half * power(10, N / 2, M)
                   + half)
                  % M;
 
        return res;
    }
    else {
        // Dividing the number into equal half
        int half = findModuloByM(X, N / 2, M) % M;
 
        // Utilizing the formula for odd N
        int res = (half * power(10, N / 2 + 1, M)
                   + half * 10 + X)
                  % M;
 
        return res;
    }
}
 
// Driver code
int main()
{
    int X = 6, N = 14, M = 9;
 
    // Print XXX...(N times) % M
    cout << findModuloByM(X, N, M);
 
    return 0;
}


Java
// Java implementation of the approach
 
class GFG
{
    // Iterative function to calculate
    // (x ^ y) % p in O(log y)
    static int power(int x, int y, int p)
    {
     
        // Initialize result
        int res = 1;
     
        // Update x if it is >= p
        x = x % p;
     
        while (y > 0)
        {
     
            // If y is odd, multiply x with result
            if (y % 2 == 1)
                res = (res * x) % p;
     
            // y must be even now
            // y = y / 2
            y = y >> 1;
            x = (x * x) % p;
        }
        return res;
    }
     
    // Function to return XXX.....(N times) % M
    static int findModuloByM(int X, int N, int M)
    {
     
        // Return the mod by M of smaller numbers
        if (N < 6)
        {
     
            // Creating a string of N X's
            String temp="";
            for(int i = 0; i< N ; i++)
                temp = temp + (char)(X + 48);
     
            // Converting the string to int
            // and calculating the modulo
            int res = Integer.parseInt(temp) % M;
     
            return res;
        }
     
        // Checking the parity of N
        if (N % 2 == 0)
        {
     
            // Dividing the number into equal half
            int half = findModuloByM(X, N / 2, M) % M;
     
            // Utilizing the formula for even N
            int res = (half * power(10, N / 2, M)
                    + half)
                    % M;
     
            return res;
        }
        else
        {
            // Dividing the number into equal half
            int half = findModuloByM(X, N / 2, M) % M;
     
            // Utilizing the formula for odd N
            int res = (half * power(10, N / 2 + 1, M)
                    + half * 10 + X)
                    % M;
     
            return res;
        }
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int X = 6, N = 14, M = 9;
     
        // Print XXX...(N times) % M
        System.out.println(findModuloByM(X, N, M));
    }
}    
 
// This code is contributed by ihritik


Python3
# Python3 implementation of the above approach
 
# Iterative function to calculate
# (x ^ y) % p in O(log y)
def power(x, y, p) :
 
    # Initialize result
    res = 1;
 
    # Update x if it is >= p
    x = x % p;
 
    while (y > 0) :
 
        # If y is odd, multiply x with result
        if (y and 1) :
            res = (res * x) % p;
 
        # y must be even now
        # y = y // 2
        y = y >> 1;
        x = (x * x) % p;
         
    return res;
 
# Function to return XXX.....(N times) % M
def findModuloByM(X, N, M) :
 
    # Return the mod by M of smaller numbers
    if (N < 6) :
 
        # Creating a string of N X's
        temp = chr(48 + X) * N
 
        # Converting the string to int
        # and calculating the modulo
        res = int(temp) % M;
 
        return res;
 
    # Checking the parity of N
    if (N % 2 == 0) :
 
        # Dividing the number into equal half
        half = findModuloByM(X, N // 2, M) % M;
 
        # Utilizing the formula for even N
        res = (half * power(10, N // 2,
                                M) + half) % M;
 
        return res;
 
    else :
         
        # Dividing the number into equal half
        half = findModuloByM(X, N // 2, M) % M;
 
        # Utilizing the formula for odd N
        res = (half * power(10, N // 2 + 1, M) +
               half * 10 + X) % M;
 
        return res;
         
# Driver code
if __name__ == "__main__" :
 
    X = 6; N = 14; M = 9;
 
    # Print XXX...(N times) % M
    print(findModuloByM(X, N, M));
 
# This code is contributed by Ryuga


C#
// C# implementation of the approach
using System;
 
class GFG
{
    // Iterative function to calculate
    // (x ^ y) % p in O(log y)
    static int power(int x, int y, int p)
    {
     
        // Initialize result
        int res = 1;
     
        // Update x if it is >= p
        x = x % p;
     
        while (y > 0)
        {
     
            // If y is odd, multiply x with result
            if (y % 2 == 1)
                res = (res * x) % p;
     
            // y must be even now
            // y = y / 2
            y = y >> 1;
            x = (x * x) % p;
        }
        return res;
    }
     
    // Function to return XXX.....(N times) % M
    static int findModuloByM(int X, int N, int M)
    {
     
        // Return the mod by M of smaller numbers
        if (N < 6)
        {
     
            // Creating a string of N X's
            string temp="";
            for(int i = 0; i< N ; i++)
                temp = temp + (char)(X + 48);
     
            // Converting the string to int
            // and calculating the modulo
            int res = Convert.ToInt32(temp) % M;
     
            return res;
        }
     
        // Checking the parity of N
        if (N % 2 == 0)
        {
     
            // Dividing the number into equal half
            int half = findModuloByM(X, N / 2, M) % M;
     
            // Utilizing the formula for even N
            int res = (half * power(10, N / 2, M)
                    + half)
                    % M;
     
            return res;
        }
        else
        {
            // Dividing the number into equal half
            int half = findModuloByM(X, N / 2, M) % M;
     
            // Utilizing the formula for odd N
            int res = (half * power(10, N / 2 + 1, M)
                    + half * 10 + X)
                    % M;
     
            return res;
        }
    }
     
    // Driver code
    public static void Main ()
    {
        int X = 6, N = 14, M = 9;
     
        // Print XXX...(N times) % M
        Console.WriteLine(findModuloByM(X, N, M));
    }
}    
 
// This code is contributed by ihritik


PHP
= p
    $x = $x % $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 // 2
        $y = $y >> 1;
        $x = ($x * $x) % $p;
    }
    return $res;
}
 
// Function to return XXX.....(N times) % M
function findModuloByM($X, $N, $M)
{
 
    // Return the mod by M of smaller numbers
    if ($N < 6)
    {
 
        // Creating a string of N X's
        $temp = chr(48 + $X) * $N;
 
        // Converting the string to int
        // and calculating the modulo
        $res = intval($temp) % $M;
 
        return $res;
    }
 
    // Checking the parity of N
    if ($N % 2 == 0)
    {
 
        // Dividing the number into equal half
        $half = findModuloByM($X, (int)($N / 2), $M) % $M;
 
        // Utilizing the formula for even N
        $res = ($half * power(10,(int)($N / 2),
                             $M) + $half) % $M;
 
        return $res;
    }
    else
    {
        // Dividing the number into equal half
        $half = findModuloByM($X, (int)($N / 2), $M) % $M;
 
        // Utilizing the formula for odd N
        $res = ($half * power(10, (int)($N / 2) + 1, $M) +
                $half * 10 + $X) % $M;
 
        return $res;
    }
}
 
// Driver code
$X = 6;
$N = 14;
$M = 9;
 
// Print XXX...(N times) % M
print(findModuloByM($X, $N, $M));
 
// This code is contributed by mits
?>


Javascript


输出:
3