前N个阶乘的乘积

给定一个数N,求出模100000007的前N个阶乘的乘积。

null

限制条件: 1.≤ N≤ 1e6

例如:

Input : 3Output : 12Explanation: 1! * 2! * 3! = 12 mod (1e9 + 7) = 12Input : 5Output : 34560

先决条件: 模乘 方法: 解决这一问题的基本思想是在这样的大数乘法运算中考虑溢出问题,即阶乘。因此,需要通过递归乘法来克服溢出的困难。此外,在迭代计算阶乘和模乘时,我们必须在每一步取模。

facti = facti-1 * iwhere facti is the factorial of ith numberprodi = prodi-1 * factiwhere prodi is the product of first i factorials

为了求两个大数在模下的乘积,我们使用与 模下的幂运算 …在乘法函数中,我们用+代替*。 以下是上述方法的实施情况。

C++

// CPP Program to find the
// product of first N factorials
#include <bits/stdc++.h>
using namespace std;
// To compute (a * b) % MOD
long long int mulmod( long long int a, long long int b,
long long int mod)
{
long long int res = 0; // Initialize result
a = a % mod;
while (b > 0) {
// If b is odd, add 'a' to result
if (b % 2 == 1)
res = (res + a) % mod;
// Multiply 'a' with 2
a = (a * 2) % mod;
// Divide b by 2
b /= 2;
}
// Return result
return res % mod;
}
// This function computes factorials and
// product by using above function i.e.
// modular multiplication
long long int findProduct( long long int N)
{
// Initialize product and fact with 1
long long int product = 1, fact = 1;
long long int MOD = 1e9 + 7;
for ( int i = 1; i <= N; i++) {
// ith factorial
fact = mulmod(fact, i, MOD);
// product of first i factorials
product = mulmod(product, fact, MOD);
// If at any iteration, product becomes
// divisible by MOD, simply return 0;
if (product == 0)
return 0;
}
return product;
}
// Driver Code to Test above functions
int main()
{
long long int N = 3;
cout << findProduct(N) << endl;
N = 5;
cout << findProduct(N) << endl;
return 0;
}


JAVA

// Java Program to find the
// product of first N factorials
class GFG{
// To compute (a * b) % MOD
static double mulmod( long a, long b,
long mod)
{
long res = 0 ; // Initialize result
a = a % mod;
while (b > 0 ) {
// If b is odd, add 'a' to result
if (b % 2 == 1 )
res = (res + a) % mod;
// Multiply 'a' with 2
a = (a * 2 ) % mod;
// Divide b by 2
b /= 2 ;
}
// Return result
return res % mod;
}
// This function computes factorials and
// product by using above function i.e.
// modular multiplication
static long findProduct( long N)
{
// Initialize product and fact with 1
long product = 1 , fact = 1 ;
long MOD = ( long )(1e9 + 7 );
for ( int i = 1 ; i <= N; i++) {
// ith factorial
fact = ( long )mulmod(fact, i, MOD);
// product of first i factorials
product = ( long )mulmod(product, fact, MOD);
// If at any iteration, product becomes
// divisible by MOD, simply return 0;
if (product == 0 )
return 0 ;
}
return product;
}
// Driver Code to Test above functions
public static void main(String[] args)
{
long N = 3 ;
System.out.println(findProduct(N));
N = 5 ;
System.out.println(findProduct(N));
}
}
// this Code is contributed by mits


Python3

# Python Program to find the
# product of first N factorials
# To compute (a * b) % MOD
def mulmod(a, b, mod):
res = 0 # Initialize result
a = a % mod
while (b > 0 ):
# If b is odd, add 'a' to result
if (b % 2 = = 1 ):
res = (res + a) % mod
# Multiply 'a' with 2
a = (a * 2 ) % mod
# Divide b by 2
b / / = 2
# Return result
return res % mod
# This function computes factorials and
# product by using above function i.e.
# modular multiplication
def findProduct(N):
# Initialize product and fact with 1
product = 1 ; fact = 1
MOD = 1e9 + 7
for i in range ( 1 , N + 1 ):
# ith factorial
fact = mulmod(fact, i, MOD)
# product of first i factorials
product = mulmod(product, fact, MOD)
# If at any iteration, product becomes
# divisible by MOD, simply return 0
if not product:
return 0
return int (product)
# Driver Code to Test above functions
N = 3
print (findProduct(N))
N = 5
print (findProduct(N))
# This code is contributed by Ansu Kumari


C#

// C#  Program to find the
// product of first N factorials
using System;
public class GFG{
// To compute (a * b) % MOD
static double mulmod( long a, long b,
long mod)
{
long res = 0; // Initialize result
a = a % mod;
while (b > 0) {
// If b is odd, add 'a' to result
if (b % 2 == 1)
res = (res + a) % mod;
// Multiply 'a' with 2
a = (a * 2) % mod;
// Divide b by 2
b /= 2;
}
// Return result
return res % mod;
}
// This function computes factorials and
// product by using above function i.e.
// modular multiplication
static long findProduct( long N)
{
// Initialize product and fact with 1
long product = 1, fact = 1;
long MOD = ( long )(1e9 + 7);
for ( int i = 1; i <= N; i++) {
// ith factorial
fact = ( long )mulmod(fact, i, MOD);
// product of first i factorials
product = ( long )mulmod(product, fact, MOD);
// If at any iteration, product becomes
// divisible by MOD, simply return 0;
if (product == 0)
return 0;
}
return product;
}
// Driver Code to Test above functions
static public void Main (){
long N = 3;
Console.WriteLine(findProduct(N));
N = 5;
Console.WriteLine(findProduct(N));
}
}
//This Code is contributed by ajit.


PHP

<?php
// PHP Program to find the
// product of first N factorials
// To compute (a * b) % MOD
function mulmod( $a , $b , $mod )
{
$res = 0; // Initialize result
$a = $a % $mod ;
while ( $b > 0)
{
// If b is odd, add 'a' to result
if ( $b % 2 == 1)
$res = ( $res + $a ) % $mod ;
// Multiply 'a' with 2
$a = ( $a * 2) % $mod ;
// Divide b by 2
$b /= 2;
}
// Return result
return $res % $mod ;
}
// This function computes factorials and
// product by using above function i.e.
// modular multiplication
function findProduct( $N )
{
// Initialize product and fact with 1
$product = 1;
$fact = 1;
$MOD = 1000000000;
for ( $i = 1; $i <= $N ; $i ++)
{
// ith factorial
$fact = mulmod( $fact , $i , $MOD );
// product of first i factorials
$product = mulmod( $product , $fact , $MOD );
// If at any iteration, product becomes
// divisible by MOD, simply return 0;
if ( $product == 0)
return 0;
}
return $product ;
}
// Driver Code
$N = 3;
echo findProduct( $N ), "" ;
$N = 5;
echo findProduct( $N ), "" ;
// This code is contributed by ajit
?>


Javascript

<script>
// Javascript Program to find the
// product of first N factorials
// To compute (a * b) % MOD
function mulmod(a, b, mod)
{
let res = 0; // Initialize result
a = a % mod;
while (b > 0) {
// If b is odd, add 'a' to result
if (b % 2 == 1)
res = (res + a) % mod;
// Multiply 'a' with 2
a = (a * 2) % mod;
// Divide b by 2
b = parseInt(b / 2, 10);
}
// Return result
return res % mod;
}
// This function computes factorials and
// product by using above function i.e.
// modular multiplication
function findProduct(N)
{
// Initialize product and fact with 1
let product = 1, fact = 1;
let MOD = (1e9 + 7);
for (let i = 1; i <= N; i++) {
// ith factorial
fact = mulmod(fact, i, MOD);
// product of first i factorials
product = mulmod(product, fact, MOD);
// If at any iteration, product becomes
// divisible by MOD, simply return 0;
if (product == 0)
return 0;
}
return product;
}
let N = 3;
document.write(findProduct(N) + "</br>" );
N = 5;
document.write(findProduct(N));
</script>


输出:

1234560

时间复杂性: O(N*logN),其中O(logN)是模乘的时间复杂度。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享