結果
問題 |
No.1784 Not a star yet...
|
ユーザー |
![]() |
提出日時 | 2025-06-05 20:28:36 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 40 ms / 2,000 ms |
コード長 | 2,288 bytes |
コンパイル時間 | 3,781 ms |
コンパイル使用メモリ | 281,956 KB |
実行使用メモリ | 36,560 KB |
最終ジャッジ日時 | 2025-06-05 20:28:43 |
合計ジャッジ時間 | 7,109 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 61 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:17:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 17 | scanf("%d",&n); | ~~~~~^~~~~~~~~ main.cpp:19:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 19 | scanf("%d%d%d",&u,&v,&l); | ~~~~~^~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h> #define mod 998244353 #define N 253 using namespace std; int power(int x,int y){ int res=1; while(y){ if(y&1) res=1ll*res*x%mod; x=1ll*x*x%mod; y=y/2; } return res; } int n,ra[N],rb[N],A,B,ans; int f[N][N][N],tmp[N],g[N][N],h[N][N]; int main(){ scanf("%d",&n); for(int i=1,u,v,l;i<n;i++){ scanf("%d%d%d",&u,&v,&l); if(l==1) A++,ra[u]++,ra[v]++; else B++,rb[u]++,rb[v]++; } int S0=A+2*B,S1=n*(n-1)/2-(n-2); int invS0=power(S0,mod-2),invS1=power(S1,mod-2); for(int j=1;j<=B;j++) f[0][j][j-1]=1; for(int i=0;i<=A;i++){ for(int j=0;j<=B;j++){ if(i==A&&j==B) continue; int dl_a=1ll*i*invS0%mod; int dl_b=2ll*j*invS0%mod; int dl_n=1ll*(S0-i-2*j)*invS0%mod; int ad0=1ll*(n-1-i-j)*invS1%mod; int ad1=1ll*(n-i-j)*invS1%mod; int ad_n0=(1+mod-ad0)%mod; int ad_n1=(1+mod-ad1)%mod; int wm=0,wl=0,wr=0,wd=0,wu=0; wm=(1ll*dl_n*ad_n0+1ll*(dl_a+dl_b)*ad1)%mod; wd=1ll*dl_a*ad_n1%mod; wu=1ll*(A-i)*invS0%mod*ad0%mod; wl=1ll*dl_b*ad_n1%mod; wr=2ll*(B-j)*invS0%mod*ad0%mod; wm=(1+mod-wm)%mod; for(int x=0;x<=B;x++) tmp[x]=1ll*f[i][j][x]*wm%mod; if(i>0){ for(int x=0;x<=B;x++) tmp[x]=(tmp[x]+1ll*(mod-wd)*f[i-1][j][x])%mod; } if(j>0){ for(int x=0;x<=B;x++) tmp[x]=(tmp[x]+1ll*(mod-wl)*f[i][j-1][x])%mod; } if(j<B){ for(int x=0;x<=B;x++) tmp[x]=(tmp[x]+1ll*(mod-wr)*f[i][j+1][x])%mod; } tmp[B]++; if(i<A){ int inv=power(wu,mod-2); for(int x=0;x<=B;x++) f[i+1][j][x]=1ll*tmp[x]*inv%mod; } else{for(int x=0;x<=B;x++) g[j][x]=tmp[x];} } } for(int i=0;i<B;i++) g[i][B]=mod-g[i][B]; for(int i=0;i<B;i++){ int inv=power(g[i][i],mod-2); for(int j=i+1;j<B;j++){ if(!g[j][i]) continue; int div=1ll*(mod-g[j][i])*inv%mod; for(int p=i;p<=B;p++) g[j][p]=(g[j][p]+1ll*div*g[i][p])%mod; } } for(int i=B-1;i>=0;i--){ for(int j=i+1;j<B;j++) g[i][B]=(g[i][B]+1ll*(mod-g[i][j])*g[j][B])%mod; g[i][B]=1ll*g[i][B]*power(g[i][i],mod-2)%mod; } g[B][B]=1; for(int i=0;i<=A;i++) for(int j=0;j<=B;j++) for(int x=0;x<=B;x++) h[i][j]=(h[i][j]+1ll*f[i][j][x]*g[x][B])%mod; ans=(h[A][B]+1ll*A*h[1][0]+1ll*B*h[0][1])%mod; for(int i=1;i<=n;i++) ans=(ans-h[ra[i]][rb[i]]+mod)%mod; ans=1ll*ans*power(n,mod-2)%mod; printf("%d",ans); }