社区讨论
求问卡常/时间复杂度
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 条回复,欢迎继续交流。
正在加载回复...