Advertisement
Guest User

Untitled

a guest
Feb 9th, 2013
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. //#define _GLIBCXX_DEBUG
  2. #include <iostream>
  3. #include <cassert>
  4. #include <cstdio>
  5. #include <set>
  6. #include <map>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cmath>
  11. #include <algorithm>
  12. #include <cstring>
  13. #include <ctime>
  14. #include <stack>
  15. #include <list>
  16. using namespace std;
  17. typedef long long li;
  18. typedef long double ld;
  19. typedef vector<li> vi;
  20. typedef pair<int, int> pi;
  21.  
  22. #define mp make_pair
  23. #define pb push_back
  24. #define all(s) s.begin(), s.end()
  25. void precalc();
  26. li solve();
  27.  
  28. int main() {
  29.     FILE* x = freopen("input", "r", stdin);
  30. #ifdef DEBUG
  31.  
  32.     clock_t start = clock();
  33. #else
  34.     x = freopen("output", "w", stdout);
  35. #endif
  36.        
  37.         //cout << 1 << endl << 1000 << endl;
  38.        // for(int i = 1; i < 1000; ++i)
  39.          //   cout << i << " "<<(rand()%2?'<':'>') << ' ' << rand() % i << endl;
  40.     (void)x;
  41.     ios_base::sync_with_stdio(false);
  42.     int t = 1;
  43.     cin >> t;
  44.     string s;
  45.         precalc();
  46.     getline(cin,s );
  47.     for(int i = 1; i <= t; ++i){
  48.         cout << "Case #" << i << ": " << solve() << '\n';
  49.     }
  50.  
  51. #ifdef DEBUG
  52.     cout << "\n\n\nTime:" << ((clock() - start) / 1.0 / CLOCKS_PER_SEC);
  53. #endif
  54.     return 0;
  55. }
  56.  
  57.  
  58. #define int li
  59. const int mod = 1000000007;
  60.  
  61. vector<char> gr[1010];
  62. vector<int> g[1010];
  63.  
  64. int c[1010][1010];
  65.  
  66. void precalc(){
  67.     for(int i = 0; i <= 1005; ++i){
  68.         c[i][0] = c[i][i] = 1;
  69.         for(int j = 1; j < i; ++j){
  70.             c[i][j] = c[i - 1][j] + c[i- 1][j - 1];
  71.             c[i][j] %= mod;
  72.         }
  73.     }
  74. }
  75.  
  76. vector<int> dfs(int v, int p){
  77.     vector<int> cur(1, 1);
  78.    
  79.     for(size_t i = 0; i < g[v].size(); ++i){
  80.         int to = g[v][i];
  81.         if(to != p){
  82.             vector<int> child = dfs(to, v);
  83.             vector<int> next(cur.size() + child.size(), 0);
  84.  
  85.             if(gr[v][i]){
  86.                 for(size_t was = 0; was < cur.size(); ++was){
  87.                     vector<int> prefsum(child.size(), 0);
  88.  
  89.                     for(size_t x = 0; x < child.size(); ++x){
  90.                         prefsum[x] = child[x] * c[x + was + 1][was] % mod * c[next.size() - 2 - x - was][cur.size() - 1 - was] + (x > 0 ? prefsum[x - 1] : 0);
  91.                         prefsum[x] %= mod;
  92.                     }
  93.                    
  94.                     for(size_t will = was + 1; will <= was + child.size(); ++will){
  95.                         next [will] += cur[was] * prefsum[will - was - 1];
  96.                         next [will] %= mod;
  97.                     }
  98.                 }
  99.                
  100.                
  101.             }
  102.             else {
  103.                 for(size_t was = 0; was < cur.size(); ++was){
  104.                     vector<li> sufsum(child.size() + 1, 0);
  105.  
  106.                     for(int x = child.size() - 1; x >= 0; --x){
  107.                         sufsum[x] = child[x] * c[x + was][was] % mod * c[next.size() - 1 - x - was][cur.size() - 1 - was] + sufsum[x + 1];
  108.                         sufsum[x] %= mod;
  109.                     }
  110.                    
  111.                     for(size_t will = was; will < was + child.size(); ++will){
  112.                         next[will] += cur[was] * sufsum[will - was];
  113.                         next[will] %= mod;
  114.                     }
  115.                 }
  116.             }
  117.            
  118.             cur = next;
  119.            
  120.         }
  121.        
  122.     }
  123.    
  124.    
  125.     return cur;
  126. }
  127.  
  128. li solve(){
  129.     int n;
  130.     cin >> n;
  131.     for(int i = 0; i < n; ++i){
  132.         gr[i].clear();
  133.         g[i].clear();
  134.     }
  135.    
  136.     for(int i = 1; i < n; ++i){
  137.         char c;
  138.         int a, b;
  139.         cin >> a >>c>> b;
  140.         if(c == '<'){
  141.             swap(a, b);
  142.         }
  143.         g[a].pb(b);
  144.         gr[a].pb(true);
  145.         g[b].pb(a);
  146.         gr[b].pb(false);
  147.     }
  148.     vector<int> c = dfs(0, -1);
  149.    
  150.     li ans = 0;
  151.     for(size_t i = 0; i < c.size(); ++i){
  152.         ans += c[i];
  153.         //cerr << c[i] << ' ';
  154.     }
  155.     return ans % mod;
  156.    
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement