POJ 1349 - Coding of Permutations
http://poj.org/problem?id=1349
概要
1 .. n の順列である p が何番目の順列であるかを答える.
例えば n=4, p=(2,3,4,1) のとき,これはは10番目であり,p=(4,2,1,3) は21番目である.
制約
- n <= 50
解法
「i 番目の数字が,残っている数の中で何番目か」を a[i] として,factorial(a[i])
を BigInteger で足していくだけ.
入力の形式が無意味に面倒.
poj/1349.java1 import java.util.*; 2 import java.io.*; 3 import java.math.*; 4 5 public class Main { 6 public static void main(String[] args) { 7 BigInteger[] facts = new BigInteger[51]; 8 facts[0] = BigInteger.ONE; 9 for (int i = 1; i <= 50; i++) { 10 facts[i] = facts[i-1].multiply(BigInteger.valueOf(i)); 11 } 12 13 Scanner cin = new Scanner(System.in); 14 String line; 15 ArrayList<BigInteger> ans = new ArrayList<BigInteger>(); 16 while (!(line = cin.next()).equals("-1")) { 17 char[] s = line.toCharArray(); 18 Pair p = readInt(s, 1); 19 int n = p.n; 20 int i = p.i+2; 21 int[] perm = new int[n]; 22 for (int j = 0; j < n; j++) { 23 p = readInt(s, i); 24 perm[j] = p.n; 25 i = p.i+1; 26 } 27 28 BigInteger m = BigInteger.ONE; 29 boolean[] used = new boolean[n]; 30 for (int j = 0; j < n-1; j++) { 31 int c = 0; 32 for (int k = 0; k < perm[j]-1; k++) { 33 if (!used[k]) { 34 ++c; 35 } 36 } 37 m = m.add(facts[n-j-1].multiply(BigInteger.valueOf(c))); 38 used[perm[j]-1] = true; 39 } 40 ans.add(m); 41 } 42 int N = ans.size(); 43 for (int i = 0; i < N; i++) { 44 if (i != 0) { 45 System.out.print(","); 46 } 47 System.out.print(ans.get(i)); 48 } 49 System.out.println(); 50 } 51 52 static Pair readInt(char[] s, int i) { 53 int n = 0; 54 while ('0' <= s[i] && s[i] <= '9') { 55 n = 10*n + s[i]-'0'; 56 i++; 57 } 58 return new Pair(n, i); 59 } 60 } 61 62 class Pair { 63 public int n, i; 64 public Pair(int n, int i) { 65 this.n = n; 66 this.i = i; 67 } 68 }