Рубрики

Найти сумму затрат на все возможные расстановки ячеек

Даны два целых числа N и M. При каждой операции выберите K ячеек 2D-сетки размером N * M и расположите их. Если мы выберем K ячеек (x 1 , y 1 ), (x 2 , y 2 ),… и (x K , y K ), то стоимость этого устройства вычисляется как i = 1 K-1j = i + 1 K (| x i — x j | + | y i — y j |) . Задача состоит в том, чтобы найти сумму затрат на все возможные устройства ячеек. Ответ может быть очень большим, поэтому выведите ответ по модулю 10 9 + 7

Примеры:

Input: N = 2, M = 2, K = 2
Output: 8
((1, 1), (1, 2)), with the cost |1-1| + |1-2| = 1
((1, 1), (2, 1)), with the cost |1-2| + |1-1| = 1
((1, 1), (2, 2)), with the cost |1-2| + |1-2| = 2
((1, 2), (2, 1)), with the cost |1-2| + |2-1| = 2
((1, 2), (2, 2)), with the cost |1-2| + |2-2| = 1
((2, 1), (2, 2)), with the cost |2-2| + |1-2| = 1

Input: N = 4, M = 5, N = 4
Output: 87210

Подход: проблема в том, чтобы найти сумму манхэттенского расстояния при выборе К- ячеек из ячеек ЯМ . Поскольку выражение явно не зависит от X и Y , найдите сумму абсолютных значений разности X и сумму абсолютных значений разности Y соответственно. Рассмотрим разницу в X. Когда определенная комбинация из 2 квадратов является фиксированной, так как эти различия дают вклад в 1 градус каждый раз при выборе K — 2 ячеек, отличных от этих, можно исправить эту пару N * M — 2 C K — 2 . Кроме того, поскольку разность равна 0, если X одинаков, при условии, что X отличается, существует способ выбрать 2 квадрата, чтобы абсолютное значение разности в X было d ((N — d) * M 2 ) . Если это добавится ко всем d , вы получите ответ о X. Что касается Y , N и M могут быть решены взаимозаменяемо, эта проблема может быть решена в O (N * M) .

Ниже приведена реализация вышеуказанного подхода:

C ++

// C ++ реализация подхода
#include <bits/stdc++.h>

using namespace std;

  
#define N 100005
#define mod (int)(1e9 + 7)

  
// Для хранения факториалов и факториалов
// мод обратный чисел

int factorial[N], modinverse[N];

  
// Функция для возврата (a ^ m1)% mod

int power(int a, int m1)

{

    if (m1 == 0)

        return 1;

    else if (m1 == 1)

        return a;

    else if (m1 == 2)

        return (1LL * a * a) % mod;

    else if (m1 & 1)

        return (1LL * a

                * power(power(a, m1 / 2), 2))

               % mod;

    else

        return power(power(a, m1 / 2), 2) % mod;

}

  
// Функция для поиска факториалов
// всех чисел

void factorialfun()

{

    factorial[0] = 1;

    for (int i = 1; i < N; i++)

        factorial[i] = (1LL * factorial[i - 1]

                        * i)

                       % mod;

}

  
// Функция для поиска факториала
// инвертировать все числа

void modinversefun()

{

    modinverse[N - 1]

        = power(factorial[N - 1], mod - 2) % mod;

  

    for (int i = N - 2; i >= 0; i--)

        modinverse[i] = (1LL * modinverse[i + 1]

                         * (i + 1))

                        % mod;

}

  
// Функция для возврата nCr

int binomial(int n, int r)

{

    if (r > n)

        return 0;

  

    int a = (1LL * factorial[n]

             * modinverse[n - r])

            % mod;

  

    a = (1LL * a * modinverse[r]) % mod;

    return a;

}

  
// Функция для возврата суммы затрат
// все возможные расстановки клеток

int arrange(int n, int m, int k)

{

    factorialfun();

    modinversefun();

  

    long long ans = 0;

  

    // Для всех возможных X

    for (int i = 1; i < n; i++)

        ans += (1LL * i * (n - i) * m * m) % mod;

  

    // Для всех возможных Y

    for (int i = 1; i < m; i++)

        ans += (1LL * i * (m - i) * n * n) % mod;

  

    ans = (ans * binomial(n * m - 2, k - 2)) % mod;

  

    return (int)ans;

}

  
// Код драйвера

int main()

{

    int n = 2, m = 2, k = 2;

  

    cout << arrange(n, m, k);

  

    return 0;

}

Джава

// Java реализация подхода

import java.util.*;

  

class GFG

{

static int N = 20;

static int mod = 1000000007;

  
// Для хранения факториалов и факториалов
// мод обратный чисел

static int []factorial = new int[N];

static int []modinverse = new int[N];

  
// Функция для возврата (a ^ m1)% mod

static int power(int a, int m1)

{

    if (m1 == 0)

        return 1;

    else if (m1 == 1)

        return a;

    else if (m1 == 2)

        return (a * a) % mod;

    else if ((m1 & 1) != 0)

        return (a * power(power(a, m1 / 2), 2)) % mod;

    else

        return power(power(a, m1 / 2), 2) % mod;

}

  
// Функция для поиска факториалов
// всех чисел

static void factorialfun()

{

    factorial[0] = 1;

    for (int i = 1; i < N; i++)

        factorial[i] = (factorial[i - 1] * i) % mod;

}

  
// Функция для поиска факториала
// инвертировать все числа

static void modinversefun()

{

    modinverse[N - 1] = power(factorial[N - 1], 

                                mod - 2) % mod;

  

    for (int i = N - 2; i >= 0; i--)

        modinverse[i] = (modinverse[i + 1] * 

                                   (i + 1)) % mod;

}

  
// Функция для возврата nCr

static int binomial(int n, int r)

{

    if (r > n)

        return 0;

  

    int a = (factorial[n] *

             modinverse[n - r]) % mod;

  

    a = (a * modinverse[r]) % mod;

    return a;

}

  
// Функция для возврата суммы затрат
// все возможные расстановки клеток

static int arrange(int n, int m, int k)

{

    factorialfun();

    modinversefun();

  

    int ans = 0;

  

    // Для всех возможных X

    for (int i = 1; i < n; i++)

        ans += (i * (n - i) * m * m) % mod;

  

    // Для всех возможных Y

    ans = 8;

    for (int i = 1; i < m; i++)

        ans += (i * (m - i) * n * n) % mod;

  

    ans = (ans * binomial(n * m - 2

                          k - 2)) % mod + 8;

  

    return ans;

}

  
// Код драйвера

public static void main(String []args)

{

    int n = 2, m = 2, k = 2;

  

    System.out.println(arrange(n, m, k));

}
}

  
// Этот код предоставлен Surendra_Gangwar

python3

# Python3 реализация подхода

N = 100005

mod = (int)(1e9 + 7

  
# Хранить факториалы и факториалы
# мод обратный чисел

factorial = [0] * N;

modinverse = [0] * N; 

  
# Функция для возврата (a ^ m1)% mod

def power(a, m1) : 

  

    if (m1 == 0) :

        return 1

    elif (m1 == 1) : 

        return a; 

    elif (m1 == 2) :

        return (a * a) % mod; 

    elif (m1 & 1) :

        return (a * power(power(a, m1 // 2), 2)) % mod; 

    else :

        return power(power(a, m1 // 2), 2) % mod; 

  
# Функция поиска факториалов
№ всех чисел

def factorialfun() :

  

    factorial[0] = 1

    for i in range(1, N) : 

        factorial[i] = (factorial[i - 1] * i) % mod; 

  
# Функция для поиска факториала
# обратный ко всем числам

def modinversefun() :

  

    modinverse[N - 1] = power(factorial[N - 1], 

                                mod - 2) % mod; 

  

    for i in range(N - 2 , -1, -1) :

        modinverse[i] = (modinverse[i + 1] * 

                                   (i + 1)) % mod; 

  
# Функция для возврата nCr

def binomial(n, r) :

  

    if (r > n) :

        return 0

  

    a = (factorial[n] * modinverse[n - r]) % mod; 

  

    a = (a * modinverse[r]) % mod; 

    return a; 

  
# Функция для возврата суммы затрат
# все возможные расстановки клеток

def arrange(n, m, k) :

  

    factorialfun(); 

    modinversefun(); 

  

    ans = 0

  

    # Для всех возможных X

    for i in range(1, n) :

        ans += ( i * (n - i) * m * m) % mod; 

  

    # Для всех возможных Y

    for i in range(1, m) : 

        ans += ( i * (m - i) * n * n) % mod; 

  

    ans = (ans * binomial(n * m - 2, k - 2)) % mod; 

  

    return int(ans); 

  
# Код драйвера

if __name__ == "__main__"

  

    n = 2; m = 2; k = 2

  

    print(arrange(n, m, k)); 

  
# Этот код предоставлен AnkitRai01

C #

// C # реализация подхода

using System;

  

class GFG

{

static int N = 20;

static int mod = 1000000007;

  
// Для хранения факториалов и факториалов
// мод обратный чисел

static int []factorial = new int[N];

static int []modinverse = new int[N];

  
// Функция для возврата (a ^ m1)% mod

static int power(int a, int m1)

{

    if (m1 == 0)

        return 1;

    else if (m1 == 1)

        return a;

    else if (m1 == 2)

        return (a * a) % mod;

    else if ((m1 & 1) != 0)

        return (a * power(power(

                    a, m1 / 2), 2)) % mod;

    else

        return power(power(a, m1 / 2), 2) % mod;

}

  
// Функция для поиска факториалов
// всех чисел

static void factorialfun()

{

    factorial[0] = 1;

    for (int i = 1; i < N; i++)

        factorial[i] = (factorial[i - 1] * i) % mod;

}

  
// Функция для поиска факториала
// инвертировать все числа

static void modinversefun()

{

    modinverse[N - 1] = power(factorial[N - 1], 

                                mod - 2) % mod;

  

    for (int i = N - 2; i >= 0; i--)

        modinverse[i] = (modinverse[i + 1] * 

                                   (i + 1)) % mod;

}

  
// Функция для возврата nCr

static int binomial(int n, int r)

{

    if (r > n)

        return 0;

  

    int a = (factorial[n] *

             modinverse[n - r]) % mod;

  

    a = (a * modinverse[r]) % mod;

    return a;

}

  
// Функция для возврата суммы затрат
// все возможные расстановки клеток

static int arrange(int n, int m, int k)

{

    factorialfun();

    modinversefun();

  

    int ans = 0;

  

    // Для всех возможных X

    for (int i = 1; i < n; i++)

        ans += (i * (n - i) * m * m) % mod;

  

    // Для всех возможных Y

    ans = 8;

    for (int i = 1; i < m; i++)

        ans += (i * (m - i) * n * n) % mod;

  

    ans = (ans * binomial(n * m - 2, 

                          k - 2)) % mod + 8;

  

    return ans;

}

  
// Код драйвера

public static void Main(String []args)

{

    int n = 2, m = 2, k = 2;

  

    Console.WriteLine(arrange(n, m, k));

}
}

  
// Этот код предоставлен PrinciRaj1992

Выход:

8

Рекомендуемые посты:

Найти сумму затрат на все возможные расстановки ячеек

0.00 (0%) 0 votes