RT 貌似输入格式有点毒结果让我只有 5 pts QAQ
本地是 windows ,下了darkbzoj 的数据测试了几组都没有问题,但是交上去就WA。
#include <bits/stdc++.h>
#define ll long long
#define Mid ((L+R)>>1)
using namespace std;
typedef pair<int,int> pii;
inline int read(){
char c;int x=0;int b=1;do{c=getchar();if(c==45)b=-1;}while(c>57||c<48);
do x=x*10+c-48,c=getchar();while(c<=57&&c>=48);x*=b;return x;
}
const int maxn=210,mod=1e9+7;
int i,j,k,n,m,f[maxn],FA[maxn];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
struct edge{
int next,to;
}a[maxn*2];
int head[maxn],len;
void add(int x,int y){
// cout<<"add "<<x<<' '<<y<<endl;
a[++len]={head[x],y};
head[x]=len;
}
int size[maxn];
ll dp[maxn][maxn],jc[maxn];
ll ksm(ll sum,int num){
ll ans=1;
while(num){
if(num&1)ans=ans*sum%mod;
sum=sum*sum%mod;
num>>=1;
}return ans;
}
ll C(int x,int y){
return jc[x]*ksm(jc[y],mod-2)%mod*ksm(jc[x-y],mod-2)%mod;
}
ll get(int a,int b,int c){
return C(c-1,a-1)*C(a-1,b+a-c)%mod;
}
int All=0;
void dfs(int now,int fa){
++All;
// cout<<"dfs.. now="<<now<<' '<<fa<<endl;
dp[now][1]=size[now]=1;
for(int i=head[now];i;i=a[i].next){
int u=a[i].to;
if(u==fa)continue;
dfs(u,now);
size[now]+=size[u];
// cout<<now<<" -> "<<u<<endl;
for(int j=size[now];j>=1;j--){
ll tmp=0;
for(int k=1;k<=min(j,size[now]-size[u]);k++)
for(int h=j-k;h<=size[u];h++){
tmp+=dp[now][k]*dp[u][h]%mod*get(k,h,j)%mod;
// cout<<j<<' '<<k<<' '<<h<<' '<<tmp<<' '<<get(k,h,j)<<endl;
tmp%=mod;
}
dp[now][j]=tmp;
}
// cout<<"done"<<endl;
}
}
ll ans=0;
inline char get() {
char c; while ((c = getchar()) != '<' && c != '='); return c;
}
int main() {
// freopen("P3240.in","r",stdin);
// freopen("P3240.out","w",stdout);
n=read();m=read();
jc[0]=1;for(i=1;i<=n+1;i++)jc[i]=jc[i-1]*i%mod;
for(i=1;i<=n;i++)f[i]=i;
for(i=1;i<=m;i++){
int x,y;char z;
x=read();z=get()/*do z=getchar();while(z!='='&&z!='<')*/;y=read();
int X=find(x),Y=find(y);
if(z=='='){
f[X]=Y;All++;
FA[Y]=FA[X];
}else FA[Y]=X;
}
for(i=1;i<=n;i++)
if(f[i]==i){
int h=find(FA[i]);
if(!h)h=n+1;
add(i,h);add(h,i);
}
dfs(n+1,0);
if(All!=n+1){puts("0");return 0;}
for(i=1;i<=n+1;i++)ans=(ans+dp[n+1][i])%mod;
cout<<ans<<endl;
//cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
return 0;
}
/*
8 7
1 < 2
1 < 3
1 < 4
3 < 5
2 < 6
4 < 7
5 < 8
*/