小菜鸡求教为什么本地AC提交WA
查看原帖
小菜鸡求教为什么本地AC提交WA
35891
huangzirui楼主2020/9/22 00:30

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
*/
2020/9/22 00:30
加载中...