基础树形DP,55分求调谢谢!
查看原帖
基础树形DP,55分求调谢谢!
482730
aSunnyDay楼主2023/8/24 21:55
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD=1000000007;
const ll N=109;
ll n,m,a[N],b[N],k[N],sz[N],ji[10*N],ji_inv[10*N],inv[10*N],f[N][N],cnt=0;//key
vector<ll> to[N];
bool ok[N];
ll C(ll a,ll b){if(a<b) return 0;return ji[a]*ji_inv[a-b]%MOD*ji_inv[b]%MOD;}
ll fang(ll i,ll j,ll k){return C(k,i)*C(i,i+j-k)%MOD;}
void F(ll x){
	ll tmp[N]={};sz[x]=1;
	for(ll i=0;i<to[x].size();++i)
		F(to[x][i]),sz[x]+=sz[to[x][i]];
	f[x][0]=1;
	for(ll i=0,v;i<to[x].size();++i){
		v=to[x][i];
		for(ll k=1;k<=sz[x];++k)
			for(ll l=0;l<=k;++l)
				for(ll m=1;m<=min(k,sz[v]);++m)
					tmp[k]+=f[x][l]*f[v][m]%MOD*fang(l,m,k)%MOD,tmp[k]%=MOD;
//		cout<<x<<":"<<sz[x]<<"  ";
		for(ll k=0;k<=sz[x];++k) f[x][k]=tmp[k],tmp[k]=0;
//		cout<<"\n";
	}
//	if(x==4){
//		cout<<"x=4:";for(ll i=0;i<=sz[x];++i) cout<<f[x][i]<<" ";
//		cout<<"\n";
//	}
	for(ll i=sz[x];i>=0;--i) f[x][i+1]=f[x][i];
	f[x][0]=0;
}
int main(){
	cin>>n>>m;
	ji[0]=ji[1]=inv[0]=inv[1]=ji_inv[0]=ji_inv[1]=1;
	
	for(ll i=2;i<10*N;++i)//n?
		ji[i]=ji[i-1]*i%MOD,
		inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD,
		ji_inv[i]=ji_inv[i-1]*inv[i]%MOD;
//	cout<<fang(1,1,1)<<"\n";
//	for(ll i=1;i<=2;++i,cout<<"\n")
//		for(ll j=1;j<=2;++j)
//			cout<<fang(i,j,2)<<" "; 
	for(ll i=1;i<=n;++i) k[i]=i;
	for(ll i=1;i<=m;++i){
		ll x,y;
		char c;
		cin>>x>>c>>y;
		if(c=='<') a[++cnt]=x,b[cnt]=y;
		else k[max(x,y)]=min(x,y);
	}
	for(ll i=1;i<=cnt;++i)
		to[k[a[i]]].push_back(k[b[i]]),ok[k[b[i]]]=1;
	for(ll i=1;i<=n;++i)
		if(k[i]==i&&!ok[i]) to[n+1].push_back(i);
//	for(ll i=1;i<=n+1;++i){
//		cout<<i<<":";
//		for(ll j=0;j<to[i].size();++j) cout<<to[i][j]<<" ";
//		cout<<"\n";
//	}
	F(n+1);ll ans=0;
	for(ll i=1;i<=n+1;++i) ans+=f[n+1][i],ans%=MOD;
//	for(ll j=1;j<=n;++j) cout<<f[n+1][j]<<" ";
//	cout<<"\n";
//	for(ll i=1;i<=n;++i,cout<<"\n")
//		for(ll j=1;j<=n;++j)
//			cout<<f[i][j]<<" ";
	cout<<ans;
	return 0;
}

错误数据

100 99
1 < 2
1 < 3
1 < 4
2 < 5
5 < 6
6 < 7
7 < 8
6 < 9
9 < 10
2 < 11
10 = 12
2 < 13
4 < 14
3 < 15
11 < 16
15 < 17
17 < 18
14 < 19
8 < 20
2 < 21
10 = 22
6 < 23
11 < 24
16 < 25
21 < 26
21 < 27
6 < 28
26 < 29
18 < 30
10 < 31
3 < 32
1 < 33
17 < 34
16 < 35
32 < 36
18 < 37
16 < 38
17 < 39
1 < 40
34 < 41
27 < 42
4 < 43
23 < 44
22 < 45
3 < 46
28 < 47
5 < 48
19 < 49
35 < 50
29 < 51
50 < 52
35 = 53
51 < 54
6 = 55
16 < 56
5 < 57
37 < 58
20 < 59
41 < 60
51 < 61
7 < 62
45 < 63
62 < 64
38 < 65
61 < 66
4 = 67
14 = 68
7 < 69
10 < 70
7 = 71
33 < 72
31 < 73
55 < 74
54 < 75
54 < 76
36 < 77
65 < 78
41 < 79
51 < 80
25 < 81
66 < 82
5 < 83
77 < 84
8 < 85
4 < 86
72 < 87
55 < 88
58 < 89
56 < 90
29 < 91
24 = 92
40 < 93
14 < 94
66 < 95
62 < 96
12 < 97
43 < 98
89 < 99
57 < 100

正确输出 "12331908"

俺的输出"894535807"

2023/8/24 21:55
加载中...