1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define maxn 2005 #define put() putchar('\n') #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; const int mod=1e9+7; int head=1,h[maxn]; struct yyy{ int to,z,flag; inline void add(int x,int y,int val) { to=y;z=h[x];h[x]=head;flag=val; } }a[maxn*2]; int n; int f[maxn][maxn],siz[maxn],c[maxn][maxn],g[maxn]; inline void add(int &x,int y) {x=(x+y)%mod;} inline void dfs(int x,int pre) { int i,j,k,l,y; siz[x]=1;f[x][1]=1; for (l=h[x];l;l=a[l].z) if (a[l].to^pre) { dfs(a[l].to,x);y=a[l].to; for (i=1;i<=siz[x];i++) g[i]=f[x][i],f[x][i]=0; for (i=1;i<=siz[x]+siz[y];i++) { for (j=1;j<=min(i,siz[x]);j++) { if (a[l].flag==1) add(f[x][i],g[j]*c[i-1][i-j]%mod*c[siz[x]+siz[y]-i][siz[x]-j]%mod*f[y][min(siz[y],i-j)]%mod); else add(f[x][i],g[j]*c[i-1][i-j]%mod*c[siz[x]+siz[y]-i][siz[x]-j]%mod*(f[y][siz[y]]-f[y][min(siz[y],i-j)]+mod)%mod); } } siz[x]+=siz[y]; }
for (i=1;i<=siz[x];i++) add(f[x][i],f[x][i-1]); } inline void solve(void) { int i,j,x,y;char ch; read(n);head=1;
memset(h,0,sizeof(h)); memset(f,0,sizeof(f)); memset(siz,0,sizeof(siz)); for (i=1;i<n;i++) { read(x);ch=getchar(); while (ch!='<'&&ch!='>') ch=getchar(); read(y);x++,y++; if (ch=='>') swap(x,y); a[++head].add(x,y,-1),a[++head].add(y,x,1); } dfs(1,0); printf("%lld",f[1][n]);put(); } signed main(void){ int T,i,j; read(T); int n=1000; for (i=0;i<=n;i++) { c[i][0]=1; for (j=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } while (T--) solve(); return 0; }
|