社区讨论

求问卡常/时间复杂度

P14938「FAOI-R10」竞唆芳杰参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mjuaxavw
此快照首次捕获于
2026/01/01 01:40
2 个月前
此快照最后确认于
2026/01/03 16:15
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const ll N=5010;
const ll mod=998244353;
ll n;
vector<ll> q[N];
ll f[N][N];
ll k;
ll u,v;
ll jc[N];
ll r_jc[N];
ll g[N];
ll h[N];
ll sumx; 
ll C[N][N];
ll dfs(ll x,ll y){
	f[x][0]=1;
	ll cnt=0;
	for(auto it:q[x]){
		if(it==y){
			continue;
		}
		cnt+=dfs(it,x);
		for(ll i=0;i<=cnt;i++){
			for(ll j=0;j<=i;j++){
				h[i]=(h[i]+f[x][j]*f[it][i-j]%mod*C[i][j]%mod)%mod;
//				cout<<f[x][i]<<" "<<x<<" "<<i<<endl;
			}
		}
		for(ll i=0;i<=cnt;i++){
			f[x][i]=h[i];
			h[i]=0;
		}	
	}
	cnt++; 
	g[0]=1;
//	for(ll i=0;i<=cnt;i++){
//		cout<<f[x][i]<<" ";
//	} 
	for(ll i=1;i<=cnt;i++){
		if(x==1){
			sumx+=f[x][i];
			sumx%=mod; 
		}
		g[i]=(f[x][i-1]+f[x][i])%mod;
	}
//	cout<<x<<" "<<cnt<<endl;
	for(ll i=0;i<=cnt;i++){
		f[x][i]=g[i];
//		cout<<f[x][i]<<" ";
//		g[i]=0;
	}
//	cout<<endl; 
	return cnt;
}
int main(){
	C[0][0]=1;
	for(ll i=1;i<=5000;i++){
		for(ll j=0;j<=5000;j++){
			if(j==0){
				C[i][j]=C[i-1][j];
			}
			else{
				C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
			}
		}
	}
//	cout<<C(1,2)%mod<<endl;
//	cout<<jc[3]*r_jc[3]%mod<<endl; 
	cin>>n>>k;
	for(ll i=1;i<=n-1;i++){
		scanf("%lld%lld",&u,&v);
		q[v].push_back(u);
		q[u].push_back(v);
	}
	dfs(1,0);
	if(k>=1){
		ll ans=0;
		for(ll i=1;i<=n;i++){
			ans=(ans+f[1][i])%mod;
		}
		cout<<ans<<endl;
	}
	else{
		cout<<(sumx+1)%mod<<endl;
	}
	return 0;
}
求问是被卡常还是时间复杂度不对

回复

4 条回复,欢迎继续交流。

正在加载回复...