QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#797550#9566. TopologyEuphoria_#WA 2ms71800kbC++142.3kb2024-12-03 11:56:042024-12-03 11:56:05

Judging History

你现在查看的是最新测评结果

  • [2024-12-03 11:56:05]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:71800kb
  • [2024-12-03 11:56:04]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n;
int fa[1000010];
long long f[1000010];
long long dp[5010][5010];
long long sum[5010][5010];
long long C[5010][5010];
int cnt,head[1000010];
int sz[1000010];
struct Edge
{
    int to,next;
}edge[1000010];
void add(int u,int v)
{
    edge[++cnt].to=v,edge[cnt].next=head[u],head[u]=cnt;
}
long long pd(long long x)
{
    if(x>=mod) return x-mod;
    return x;
}
void p(long long &x)
{
    if(x>=mod) x-=mod;
    return ;
}
void get_f(int u,int fa)
{
    sz[u]=0,f[u]=1;
    for(int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v==fa) continue;
        get_f(v,u),f[u]=f[u]*f[v]%mod*C[sz[u]+sz[v]][sz[v]]%mod;
        sz[u]+=sz[v];
    }
    sz[u]++;
    return ;
}
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v==fa) continue;
        int nowsize=0;
        long long nowval=1;
        for(int i=head[u];i;i=edge[i].next)
        {
            int to=edge[i].to;
            if(to==v||to==fa) continue;
            (nowval*=f[to]*C[nowsize+sz[to]][sz[to]]%mod)%=mod;
            nowsize+=sz[to];
        }
        for(int now=1;now<=n-sz[u]+1;now++)
        {
            // long long nowsum=0;
            // for(int lst=0;lst<now;lst++) p(nowsum+=dp[u][lst]);
            // dp[v][now]=nowsum*nowval%mod*C[n-sz[u]+1-now+nowsize][nowsize]%mod;
            dp[v][now]=sum[u][now-1]*nowval%mod*C[n-sz[u]+1-now+nowsize][nowsize]%mod;
            sum[v][now]=dp[v][now];
            // if(v==2) printf("%d %lld %lld %lld\n",now,dp[v][now],nowsum,nowval);
        }
        for(int i=1;i<=n;i++) p(sum[v][i]+=sum[v][i-1]);
        dfs(v,u);
    }
    return ;
}
int main()
{
    scanf("%d",&n);
    for(int i=2;i<=n;i++) scanf("%d",&fa[i]),add(fa[i],i);
    for(int i=0;i<=n;i++) C[i][0]=1;
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) C[i][j]=pd(C[i-1][j]+C[i-1][j-1]);
    get_f(1,0),dp[1][0]=1;
    for(int i=0;i<=n;i++) sum[1][i]=1;
    dfs(1,0);
    for(int i=1;i<=n;i++)
    {
        long long nowsum=0;
        for(int lst=0;lst<i;lst++) nowsum+=dp[i][lst];
        // printf("%lld %lld ",nowsum,f[i]);
        printf("%lld ",f[i]*C[n-i][sz[i]-1]%mod*nowsum%mod);
    }
    printf("\n");
    return 0;
}
/*
9
1 1 2 2 3 3 4 5
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 16184kb

input:

4
1 1 2

output:

3 2 1 2 

result:

ok 4 number(s): "3 2 1 2"

Test #2:

score: 0
Accepted
time: 0ms
memory: 14256kb

input:

9
1 1 2 2 3 3 4 5

output:

672 420 180 160 152 108 120 170 210 

result:

ok 9 numbers

Test #3:

score: 0
Accepted
time: 2ms
memory: 14176kb

input:

2
1

output:

1 1 

result:

ok 2 number(s): "1 1"

Test #4:

score: -100
Wrong Answer
time: 0ms
memory: 71800kb

input:

500
1 2 3 4 5 6 7 7 8 10 8 10 11 4 11 12 12 17 15 13 21 21 22 5 16 9 24 28 28 19 29 27 17 33 23 3 33 27 30 9 25 34 16 26 30 34 46 45 41 14 43 49 43 35 39 37 26 48 52 58 51 56 51 55 19 48 63 36 67 69 54 60 71 61 29 40 32 77 73 55 66 42 77 72 71 69 62 83 46 64 88 39 83 36 89 94 47 98 57 61 38 80 78 88...

output:

331058271 331058271 107893248 201481008 579367731 934007150 548415590 60830816 948776140 565765713 126668425 603509050 491206892 433369091 271511598 706737964 70425819 69672788 713120782 734952162 267434947 720007515 670449595 828144080 372921049 434477621 877300187 307269573 636190001 793011806 -60...

result:

wrong answer 31st numbers differ - expected: '327684609', found: '-604367301'