📌  相关文章
📜  通过交换对的相同位置位来最小化前 N – 1 个自然数的乘积

📅  最后修改于: 2021-10-26 05:32:04             🧑  作者: Mango

给定一个整数N ,任务是通过交换任意两个数字的任意i位任意次数来找到前N – 1 个自然数的最小正积,即[1, (N – 1)]

注意: N 总是 2 的完美幂。由于乘积可能非常大,打印答案模10 9 + 7

例子:

方法:这个想法是做一些观察。例如,如果N = 8arr[] = {1, 2, 3, 4, 5, 6, 7} ,请注意要使乘积最小,必须有三个六,即必须有一个元素具有值(N – 2)出现频率为(1 + (N – 4)/2)并且必须有三个,即必须有(1 + (N – 4)/2)个。最后将当前乘积乘以(N – 1) 。因此,公式变为:

请按照以下步骤解决问题:

  1. ans初始化为1
  2. 迭代范围[0, 1 + (N – 4)/2]
  3. 在每次遍历中,将ans乘以N – 2并将ans更新为ans mod 1e9+7
  4. 经过以上步骤,打印ans*(N – 1) mod 1e9+7 的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
 
#include 
using namespace std;
 
int mod = 1e9 + 7;
 
// Function to find the minimum product
// of 1 to N - 1 after performing the
// given operations
void minProduct(int n)
{
    // Initialize ans with 1
    int ans = 1;
 
    // Multiply ans with N-2
    // ((N - 4)/2) times
    for (int i = 1;
         i <= (n - 4) / 2; i++) {
        ans = (1LL * ans
               * (n - 2))
              % mod;
    }
 
    // Multiply ans with N - 1
    // and N - 2 once
    ans = (1LL * ans
           * (n - 2) * (n - 1))
          % mod;
 
    // Print ans
    cout << ans << endl;
}
 
// Driver Code
int main()
{
    // Given Number N
    int N = 8;
 
    // Function Call
    minProduct(N);
 
    return 0;
}


Java
// Java program for the
// above approach
import java.util.*;
class GFG{
 
static int mod = (int)1e9 + 7;
 
// Function to find the
// minimum product of 1
// to N - 1 after performing
// the given operations
static void minProduct(int n)
{
  // Initialize ans with 1
  int ans = 1;
 
  // Multiply ans with N-2
  // ((N - 4)/2) times
  for (int i = 1;
           i <= (n - 4) / 2; i++)
  {
    ans = (int)(1L * ans *
               (n - 2)) % mod;
  }
 
  // Multiply ans with N - 1
  // and N - 2 once
  ans = (int)(1L * ans *
             (n - 2) * (n - 1)) % mod;
 
  // Print ans
  System.out.print(ans + "\n");
}
 
// Driver Code
public static void main(String[] args)
{
  // Given Number N
  int N = 8;
 
  // Function Call
  minProduct(N);
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program for the above approach
mod = 1e9 + 7
 
# Function to find the minimum product
# of 1 to N - 1 after performing the
# given operations
def minProduct(n):
     
    # Initialize ans with 1
    ans = 1
 
    # Multiply ans with N-2
    # ((N - 4)/2) times
    for i in range(1, (n - 4) // 2 + 1):
        ans = (ans * (n - 2)) % mod
 
    # Multiply ans with N - 1
    # and N - 2 once
    ans = (ans * (n - 2) * (n - 1)) % mod
 
    # Print ans
    print(int(ans))
 
# Driver Code
if __name__ == '__main__':
     
    # Given number N
    N = 8
 
    # Function call
    minProduct(N)
 
# This code is contributed by mohit kumar 29


C#
// C# program for the
// above approach
using System;
class GFG{
 
static int mod = (int)1e9 + 7;
 
// Function to find the
// minimum product of 1
// to N - 1 after performing
// the given operations
static void minProduct(int n)
{
  // Initialize ans with 1
  int ans = 1;
 
  // Multiply ans with N-2
  // ((N - 4)/2) times
  for (int i = 1;
           i <= (n - 4) / 2; i++)
  {
    ans = (int)(1L * ans *
               (n - 2)) % mod;
  }
 
  // Multiply ans with N - 1
  // and N - 2 once
  ans = (int)(1L * ans *
             (n - 2) *
             (n - 1)) % mod;
 
  // Print ans
  Console.Write(ans + "\n");
}
 
// Driver Code
public static void Main(String[] args)
{
  // Given Number N
  int N = 8;
 
  // Function Call
  minProduct(N);
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出
1512

时间复杂度: O(N),其中 N 是给定的整数。
辅助空间: O(1)