Advertisement
Nickpips

Dominoes

Sep 3rd, 2016
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.00 KB | None | 0 0
  1. import java.awt.Point;
  2. import java.util.Scanner;
  3.  
  4. public class dominoes {
  5.     public static void debug(Object o) {
  6.         System.out.println("\tDEBUG: " + o.toString().replaceAll("\n", "\n\tDEBUG: "));
  7.     }
  8.    
  9.     static long modulus = (long) (10e9 + 7);
  10.    
  11.     public static long factorial(long a)
  12.     {
  13.         long ans = 1;
  14.         for( long i = 2; i <= a; i++ )
  15.         {
  16.             ans *= i;
  17.             ans %= modulus;
  18.         }
  19.         return ans;
  20.     }
  21.  
  22.     public static void main(String[] args) {
  23.         Scanner in = new Scanner(System.in);
  24.  
  25.         long T = in.nextInt();
  26.         for (long t = 1; t <= T; t++) {
  27.             int n = in.nextInt();
  28.  
  29.             Point[] doms = new Point[n];
  30.             for (int i = 0; i < n; i++) {
  31.                 doms[i] = new Point(in.nextInt() - 1, in.nextInt() - 1);
  32.             }
  33.  
  34.             boolean same = true;
  35.             for (int i = 0; i < n; i++) {
  36.                 for (int j = i + 1; j < n; j++) {
  37.                     if (!(doms[i].equals(doms[j]) || doms[i].equals(new Point(doms[j].y, doms[j].x))))
  38.                         same = false;
  39.                 }
  40.             }
  41.             if( same == true )
  42.             {
  43.                 System.out.println(factorial(n));
  44.                 continue;
  45.             }
  46.  
  47.             long[][] dp = new long[(1 << n)][6];
  48.  
  49.             for (int i = 0; i < 6; i++) {
  50.                 dp[0][i] = 1;
  51.             }
  52.  
  53.             for (int i = 0; i < dp.length; i++) {
  54.                 for (int d = 0; d < n; d++) {
  55.                     if (((i >> d) & 1) != 0)
  56.                         continue;
  57.                     Point dom = doms[d];
  58.  
  59.                     int index = i | (1 << d);
  60.                    
  61.                     if( index >= dp.length )
  62.                         continue;
  63.  
  64.                     // boolean accounted = false;
  65.                     for (int j = 0; j < 6; j++) {
  66.                         /*
  67.                          * if ((dom.x == j || dom.y == j) && index == (int)
  68.                          * Math.pow(2, n) - 1 && accounted == false) { last[d]
  69.                          * += dp[i][j]; accounted = true; }
  70.                          */
  71.                         if (dom.x == j) {
  72.                             dp[index][dom.y] += dp[i][j];
  73.                             dp[index][dom.y] %= modulus;
  74.                         } else if (dom.y == j) {
  75.                             dp[index][dom.x] += dp[i][j];
  76.                             dp[index][dom.x] %= modulus;
  77.                         }
  78.                     }
  79.                 }
  80.             }
  81.  
  82.             long sum = 0;
  83.             for (int i = 0; i < 6; i++) {
  84.                 sum += dp[dp.length - 1][i];
  85.                 sum %= modulus;
  86.             }
  87.  
  88.             System.out.println(sum);
  89.         }
  90.        
  91.         in.close();
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement