Comprueba si un número muy grande de la forma dada es múltiplo de 3.

Considere un número N muy largo de K dígitos con dígitos d 0 , d 1 , …, d K-1 (en notación decimal; d 0 es el dígito más significativo y d K-1 el dígito menos significativo). Este número es tan grande que no se puede dar ni escribir explícitamente; en cambio, solo se dan sus dígitos iniciales y una forma de construir el resto del número.
Específicamente, se le da d 0 y d 1 ; para cada i ≥ 2, d i es la suma de todos los dígitos anteriores (más significativos), módulo 10, más formalmente: 
determine si N es un múltiplo de 3.

Restricciones: 
2 ≤K ≤10 12 
1 ≤d 0 ≤9 
0 ≤d 1 ≤9 

Ejemplos: 

Input : K = 13, d0 = 8, d1 = 1
Output : YES

Explicación: el número entero N es 8198624862486 , que es divisible por 3, 
por lo que la respuesta es SÍ. 

Input :  K = 5, d0 = 3, d1 = 4
Output : NO

Explicación: el número entero N es 34748 , que no es divisible por 3, 
por lo que la respuesta es NO.

Método 1 (Fuerza bruta) 

Podemos aplicar el método de fuerza bruta para calcular el número entero N usando la condición dada para construir el número iterativamente (suma de los números anteriores módulo 10) y verificar si el número es divisible por 3 o no. Pero dado que el número de dígitos (K) puede ser tan grande como 10 12 , no podemos almacenarlo como un número entero ya que será mucho mayor que el rango máximo de ‘long long int’. Por lo tanto, a continuación se muestra un método eficiente para determinar si N es un múltiplo de 3.

Método 2 (eficiente) 

La idea clave detrás de la solución es el hecho de que los dígitos comienzan a repetirse después de un tiempo en un ciclo de longitud 4. Primero, encontraremos la suma de todos los dígitos y luego determinaremos si es divisible por 3 o NO.

Sabemos d 0 y d 1
re 2 = ( re 0 + re 1 ) % 10
re 3 = ( re 2 + re 1 + re 0 ) % 10 = (( re 0 + re 1 ) % 10 + re 0 + re 1 ) % 10 = 2 * ( re 0 + re 1 ) % 10
De manera similar, 
re 4 = ( re 3 + re 2 + re 1 + re 0 ) % 10 = 4 * ( re 0 + re 1) % 10
re 5 = ( re 4 + re 3 + re 2 + re 1 + re 0 ) % 10 = 8 * ( re 0 + re 1 ) % 10
re 6 = ( re 5 + … + re 1 + re 0 ) % 10 = 16 * (re 0 + re 3 ) % 10 = 6 * ( re 0 + re 1 ) % 10
re 7 = ( re 6 + … + re 1 + re 0 ) % 10 = 12 * ( re 0 + re 1 ) % 10 =2 * ( día 0 + día 1 ) % 10 
 

Si seguimos encontrando en d i , veremos que la resultante simplemente gira alrededor de los mismos valores (2, 4, 8, 6). 
Aquí la duración del ciclo es 4 y d 2 no está presente en el ciclo. Por lo tanto, después de d 2 , el ciclo comienza a formarse con una longitud de 4 a partir de cualquier valor en (2, 4, 8, 6) pero en el mismo orden dando una suma de S = 2 + 4 + 8 + 6 = 20 para cuatro dígitos consecutivos . Por lo tanto, la suma total de dígitos para el número entero es = d 0 + d 1 + d 2 + S*(k – 3)/4 + x, donde los primeros tres términos estarán cubiertos por d 0 , d 1 , d 2 
y después de eso, los grupos de 4 estarán cubiertos por S. Pero dado que (k – 3) puede no ser un múltiplo de 4, quedarán algunos dígitos restantes que están cubiertos por x, que se pueden calcular ejecutando un bucle como ese número de términos será menor que 4. 

Por ejemplo  , cuando K = 13, 
suma de dígitos = d 0 + d 1 + d 2 + S * (13 – 3) / 4 + x = d 0 + d 1 + d 2 + S * 2 + x, 
donde primero S tendrá d 3 , d 4 , d 5 , d 6 y la segunda S tendrá d 7 , d 8 , d 9 , d 10
x = d 11 + d 12 

  • re 11 = 2 * ( re 0 + re 1 ) % 10
  • re 12 = 4 * ( re 0 + re 1 ) % 10

A continuación se muestra la implementación de la idea anterior: 

C++

// CPP Program to determine if
// number N of given form is
// divisible by 3 or not
#include <bits/stdc++.h>
using namespace std;
 
// function returns true if number N is
// divisible by 3 otherwise false,
// dig0 - most significant digit
// dig1 - 2nd most significant digit
// K - number of digits
bool multipleOfThree(int K, int dig0, int dig1)
{
    // sum of digits
    long long int sum = 0;
 
    // store the sum of first two digits
    // modulo 10 in a temporary variable
    int temp = (dig0 + dig1) % 10;
 
    sum = dig0 + dig1;
 
    // if the number N is a two digit number
    if (K == 2) {
        if (sum % 3 == 0)
            return true;
        else
            return false;
    }
 
    // add temp to sum to get the sum
    // of first three digits which are
    // not a part of cycle
    sum += temp;
 
    // get the number of groups in cycle
    long long int numberofGroups = (K - 3) / 4;
 
    // get the remaining number of digits
    int remNumberofDigits = (K - 3) % 4;
 
    // if temp = 5 or temp = 0 then sum of each group will
    // be 0
    if (temp == 5 || temp == 0)
        sum += (numberofGroups * 0);
 
    else
        // add sum of 20 for each group (2, 4, 8, 6)
        sum += (numberofGroups * 20);
 
    // find the remaining sum of remaining digits
    for (int i = 0; i < remNumberofDigits; i++) {
        temp = (2 * temp) % 10;
        sum += temp;
    }
 
    // check if it is divisible by 3 or not
    if (sum % 3 == 0)
        return true;
    else
        return false;
}
 
// Driver Code
int main()
{
    int K = 5, dig0 = 3, dig1 = 4;
    if (multipleOfThree(K, dig0, dig1))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
 
    K = 10;
    dig0 = 3;
    dig1 = 2;
    if (multipleOfThree(K, dig0, dig1))
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}

Java

// Java Program to determine if
// number N of given form is
// divisible by 3 or not
import java.io.*;
 
public class GFG {
 
    // function returns true if number N is
    // divisible by 3 otherwise false,
    // dig0 - most significant digit
    // dig1 - 2nd most significant digit
    // K - number of digits
    static boolean multipleOfThree(int K, int dig0,
                                   int dig1)
    {
 
        // sum of digits
        long sum = 0;
 
        // store the sum of first two digits
        // modulo 10 in a temporary variable
        int temp = (dig0 + dig1) % 10;
 
        sum = dig0 + dig1;
 
        // if the number N is a two digit number
        if (K == 2) {
            if (sum % 3 == 0)
                return true;
            else
                return false;
        }
 
        // add temp to sum to get the sum
        // of first three digits which are
        // not a part of cycle
        sum += temp;
 
        // get the number of groups in cycle
        long numberofGroups = (K - 3) / 4;
 
        // get the remaining number of digits
        int remNumberofDigits = (K - 3) % 4;
 
        // add sum of 20 for each group (2, 4, 8, 6)
        sum += (numberofGroups * 20);
 
        // find the remaining sum of
        // remaining digits
        for (int i = 0; i < remNumberofDigits; i++) {
            temp = (2 * temp) % 10;
            sum += temp;
        }
 
        // check if it is divisible by 3 or not
        if (sum % 3 == 0)
            return true;
        else
            return false;
    }
 
    // Driver Code
    static public void main(String[] args)
    {
        int K = 5, dig0 = 3, dig1 = 4;
        if (multipleOfThree(K, dig0, dig1))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by vt_m.

Python 3

# Python 3 Program to determine if
# number N of given form is
# divisible by 3 or not
 
# function returns true if number N
# is divisible by 3 otherwise false,
# dig0 - most significant digit
# dig1 - 2nd most significant digit
# K - number of digits
 
 
def multipleOfThree(K, dig0, dig1):
 
    # sum of digits
    sum = 0
 
    # store the sum of first two digits
    # modulo 10 in a temporary variable
    temp = (dig0 + dig1) % 10
 
    sum = dig0 + dig1
 
    # if the number N is a
    # two digit number
    if (K == 2):
        if (sum % 3 == 0):
            return True
        else:
            return False
 
    # add temp to sum to get the sum
    # of first three digits which are
    # not a part of cycle
    sum += temp
 
    # get the number of groups in cycle
    numberofGroups = (K - 3) // 4
 
    # get the remaining number of digits
    remNumberofDigits = (K - 3) % 4
 
    # add sum of 20 for each
    # group (2, 4, 8, 6)
    sum += (numberofGroups * 20)
 
    # find the remaining sum of
    # remaining digits
    for i in range(remNumberofDigits):
        temp = (2 * temp) % 10
        sum += temp
 
    # check if it is divisible
    # by 3 or not
    if (sum % 3 == 0):
        return True
    else:
        return False
 
 
# Driver Code
if __name__ == "__main__":
    K = 5
    dig0 = 3
    dig1 = 4
    if (multipleOfThree(K, dig0, dig1)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by ChitraNayal

C#

// C# Program to determine if
// number N of given form is
// divisible by 3 or not
using System;
 
class GFG {
 
    // function returns true if number N is
    // divisible by 3 otherwise false,
    // dig0 - most significant digit
    // dig1 - 2nd most significant digit
    // K - number of digits
    static bool multipleOfThree(int K, int dig0, int dig1)
    {
        // sum of digits
        long sum = 0;
 
        // store the sum of first two digits
        // modulo 10 in a temporary variable
        int temp = (dig0 + dig1) % 10;
 
        sum = dig0 + dig1;
 
        // if the number N is
        // a two digit number
        if (K == 2) {
            if (sum % 3 == 0)
                return true;
            else
                return false;
        }
 
        // add temp to sum to get the sum
        // of first three digits which are
        // not a part of cycle
        sum += temp;
 
        // get the number of groups in cycle
        long numberofGroups = (K - 3) / 4;
 
        // get the remaining number of digits
        int remNumberofDigits = (K - 3) % 4;
 
        // add sum of 20 for each group (2, 4, 8, 6)
        sum += (numberofGroups * 20);
 
        // find the remaining sum of
        // remaining digits
        for (int i = 0; i < remNumberofDigits; i++) {
            temp = (2 * temp) % 10;
            sum += temp;
        }
 
        // check if it is divisible by 3 or not
        if (sum % 3 == 0)
            return true;
        else
            return false;
    }
 
    // Driver Code
    static public void Main(String[] args)
    {
        int K = 5, dig0 = 3, dig1 = 4;
        if (multipleOfThree(K, dig0, dig1))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP Program to determine if number N
// of given form is divisible by 3 or not
 
// function returns true if number N
// is divisible by 3 otherwise false,
// dig0 - most significant digit
// dig1 - 2nd most significant digit
// K - number of digits
function multipleOfThree($K, $dig0, $dig1)
{
    // sum of digits
    $sum = 0;
 
    // store the sum of first two digits
    // modulo 10 in a temporary variable
    $temp = ($dig0 + $dig1) % 10;
 
    $sum = $dig0 + $dig1;
 
    // if the number N is a
    // two digit number
    if ($K == 2)
        if ($sum % 3 == 0)
            return true;
        else
            return false;
 
    // add temp to sum to get the sum
    // of first three digits which are
    // not a part of cycle
    $sum += $temp;
 
    // get the number of groups in cycle
    $numberofGroups = (int)(($K - 3) / 4);
 
    // get the remaining number of digits
    $remNumberofDigits = ($K - 3) % 4;
 
    // add sum of 20 for each
    // group (2, 4, 8, 6)
    $sum += ($numberofGroups * 20);
 
    // find the remaining sum of
    // remaining digits
    for ($i = 0; $i < $remNumberofDigits; $i++)
    {
        $temp = (2 * $temp) % 10;
        $sum += $temp;
    }
 
    // check if it is divisible
    // by 3 or not
    if ($sum % 3 == 0)
        return true;
    else
        return false;
}
 
// Driver Code
$K = 5;
$dig0 = 3;
$dig1 = 4;
if (multipleOfThree($K, $dig0, $dig1))
    print("Yes");
else
    print("No");
 
// This code is contributed by mits
?>

Javascript

<script>
 
// JavaScript Program to determine if
// number N of given form is
// divisible by 3 or not
 
// function returns true if number N is
// divisible by 3 otherwise false,
// dig0 - most significant digit
// dig1 - 2nd most significant digit
// K - number of digits
function multipleOfThree(K, dig0, dig1)
{
    // sum of digits
    let sum = 0;
 
    // store the sum of first two digits
    // modulo 10 in a temporary variable
    let temp = (dig0 + dig1) % 10;
 
    sum = dig0 + dig1;
 
    // if the number N is a two digit number
    if (K == 2) {
        if (sum % 3 == 0)
            return true;
        else
            return false;
    }
 
    // add temp to sum to get the sum
    // of first three digits which are
    // not a part of cycle
    sum += temp;
 
    // get the number of groups in cycle
    let numberofGroups = parseInt((K - 3) / 4);
 
    // get the remaining number of digits
    let remNumberofDigits = (K - 3) % 4;
 
    // if temp = 5 or temp = 0 then sum of each group will
    // be 0
    if (temp == 5 || temp == 0)
        sum += (numberofGroups * 0);
 
    else
        // add sum of 20 for each group (2, 4, 8, 6)
        sum += (numberofGroups * 20);
 
    // find the remaining sum of remaining digits
    for (let i = 0; i < remNumberofDigits; i++) {
        temp = (2 * temp) % 10;
        sum += temp;
    }
 
    // check if it is divisible by 3 or not
    if (sum % 3 == 0)
        return true;
    else
        return false;
}
 
// Driver Code
    let K = 5, dig0 = 3, dig1 = 4;
    if (multipleOfThree(K, dig0, dig1))
        document.write("YES<br>");
    else
        document.write("NO<br>");
 
    K = 10;
    dig0 = 3;
    dig1 = 2;
    if (multipleOfThree(K, dig0, dig1))
        document.write("YES<br>");
    else
        document.write("NO<br>");
         
</script>
Producción

NO
NO

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por Nishant Tanwar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *