📜  找到XXXX的值…..(N次)%M,其中N大

📅  最后修改于: 2021-04-24 17:16:09             🧑  作者: 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
?>


输出:
3