📌  相关文章
📜  通过交换成对的相同定位位,使前N – 1个自然数的乘积最小

📅  最后修改于: 2021-04-29 15:35:29             🧑  作者: Mango

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

注意: N始终是2的理想幂。由于乘积可能很大,所以以10 9 + 7为模输出答案。

例子:

方法:这个想法是做一些观察。例如,如果N = 8arr [] = {1,2,3,4,5,6,7} ,请注意,要使乘积最小,必须有三个6,即,必须有一个具有值的元素(N – 2)的出现频率为(1 +(N – 4)/ 2),并且必须有3个,即,必须有(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)