Advertisement
royalsflush

MALFORMA - SPOJ Br (Lazera)

Sep 21st, 2012
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. #define TRACE(x...) x
  9. #define PRINT(x...) TRACE(printf(x))
  10. #define WATCH(x) TRACE(cout << #x << " = " << x << endl;)
  11.  
  12. #define MAXN 60
  13.  
  14. char v[MAXN];
  15. long long pd[MAXN][MAXN];
  16. long long cat[MAXN];
  17.  
  18. long long f(int n, int folga) {
  19.     if(folga > n || folga < 0) return 0;
  20.     if(n == 0) return 0;
  21.     if(folga == n) return 1;
  22.     if(pd[n][folga] != -1) return pd[n][folga];
  23.    
  24.     pd[n][folga] = f(n-1, folga+1); //ponho "("
  25.    
  26.     if(folga > 0) //ponho ")"
  27.         pd[n][folga] += f(n-1, folga-1);
  28.    
  29.     return pd[n][folga];
  30. }
  31.  
  32. long long f2(int n, int folga) {
  33.     long long p2 = 1;
  34.     for(int i = 1; i <= n; i++) p2 *= 2;
  35.     return p2 - f(n, folga);
  36. }
  37.  
  38. void preenche(int n, int k, int folga) {
  39.     if(n == 0) return;
  40.     printf("n, k, folga, f1(n-1, folga+1) = %d, %d, %d, %lld\n",
  41.         n, k, folga, f2(n-1, folga+1));
  42.     if( f2(n-1, folga+1) >= k ) {
  43.         v[n] = '0';
  44.         preenche(n-1, k, folga+1);
  45.     }
  46.  
  47.     else {
  48.         v[n] = '1';
  49.         k -= f2(n-1, folga+1);
  50.         preenche(n-1, k, folga-1);
  51.     }
  52. }
  53.  
  54. void calc() {
  55.     memset(cat, 0, sizeof(cat));
  56.     cat[2] = 1;
  57.     cat[1] = 0;
  58.     cat[0] = 1;
  59.     for(int i = 3; i <= 51; i++) {
  60.         if(i%2 == 1) continue;
  61.         for(int j = 0; j < i; j+=2)
  62.             cat[i] += cat[j]*cat[i-2-j];
  63.     }
  64. }
  65.  
  66. int main() {
  67.     int T, N, K;
  68.     calc();
  69.     scanf("%d", &T);
  70.     while(T--) {
  71.         scanf("%d %d", &N, &K);
  72.  
  73.         for(int i = 0; i < MAXN; i++)
  74.             for(int j = 0; j < MAXN; j++)
  75.                 pd[i][j] = -1;
  76.        
  77.         v[N] = '?';
  78.         K++; //indexo a partir do 1
  79.         // ateh aqui nada
  80.         for(int i = 2; i <= 10; i++) printf("cat = %lld\n", cat[i]);
  81.  
  82.         if( K <= ( (1LL<<N) - cat[N]) ) preenche(N, K, 0);
  83.  
  84.         if(v[N] == '?') printf("-1");
  85.         else
  86.             for(int i = N; i > 0; i--)
  87.                 printf("%c", v[i]);
  88.         printf("\n");
  89.     }
  90.        
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement