简体   繁体   中英

How to count the number of permutations?

We are given array-'a' and array-'b' consisting of positive integers. How can I count all the permutation of array 'a' which are strictly lexicographically smaller than array-'b'?

Arrays can contain as many as 10^5 integers(positive)

Example:

1 2 3 is lexicographically smaller than 3 1 2

1 2 3 is lexicographically smaller than 1 4 5.

I would like the solution to be in C++.

Input : 3

1 2 3

2 1 3

Output : 2

Only permutations 1,2,3 and 1,3,2 are lexicographically smaller than 2 1 3

Let's just tackle the algorithm. Once you get that figured out, the implementation should be pretty straightforward. Does this look like it does what you're looking for?

Pseudo code:

function get_perms(a,b)
    #count the number of digits in a that are <b[0]
    count = sum(a<b[0])
    Nperms = (len(a)-1)! #modify this formula as needed
    N = count*Nperms
    if sum(a==b[0]) > 0
        remove 1 b[0] from a
        # repeat the process with the substring assuming a[0]==b[0]
        N += sum(a==b[0])*get_perms(a,b[1:end])
    return N

main()
    get_perms(a,b)

Edit: I did a little searching. I believe that this is what you are looking for.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM