結果
| 問題 | No.1784 Not a star yet... | 
| コンテスト | |
| ユーザー |  QZJ123456 | 
| 提出日時 | 2025-06-05 21:26:02 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 104 ms / 2,000 ms | 
| コード長 | 3,444 bytes | 
| コンパイル時間 | 2,523 ms | 
| コンパイル使用メモリ | 214,652 KB | 
| 実行使用メモリ | 48,708 KB | 
| 最終ジャッジ日時 | 2025-06-05 21:26:13 | 
| 合計ジャッジ時間 | 7,157 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 61 | 
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:60:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   60 |         scanf("%d",&n);
      |         ~~~~~^~~~~~~~~
main.cpp:62:32: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   62 |                 int x,y,z;scanf("%d%d%d",&x,&y,&z);
      |                           ~~~~~^~~~~~~~~~~~~~~~~~~
            
            ソースコード
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll mod=998244353;
int X,Y,d1[255],d2[255],n;
ll mat[505][505];
map<ll,ll>mp[100005];
ll ksm(ll a,ll m,ll p){
	ll ans=1;
	while(m){
		if(m&1)ans=ans*a%p;
		a=a*a%p;
		m>>=1;
	}
	return ans;
}
int Getid(int i,int j){
	i++,j++;
	return (i-1)*(Y+1)+j;
}
ll xs[255][255][255];
void gauss(int n){
	for(int i=1;i<=n;i++){
		int p=i;
		for(int j=i+1;j<=n;j++){
			if(mat[j][i])p=j;
		}
		swap(mat[i],mat[p]);
		ll inv=ksm(mat[i][i],mod-2,mod);
		for(int j=i+1;j<=n;j++){
			ll val=mat[j][i]*inv%mod;
			for(int k=i;k<=n+1;k++)mat[j][k]=(mat[j][k]-mat[i][k]*val%mod+mod)%mod;
		}
	}
	for(int i=n;i;i--){
		mat[i][n+1]=mat[i][n+1]*ksm(mat[i][i],mod-2,mod)%mod;
		for(int j=1;j<i;j++)mat[j][n+1]=(mat[j][n+1]-mat[i][n+1]*mat[j][i]%mod+mod)%mod;
	}
	return;
}
void add(int x,int y,int x1,int y1,ll val){
	for(int i=0;i<=Y+1;i++)xs[x][y][i]=(xs[x][y][i]+xs[x1][y1][i]*val)%mod;
}
void dec(int x,int y,int x1,int y1,ll val){
	add(x,y,x1,y1,mod-val);
}
void add(int x,int y,ll val){
	xs[x][y][Y+1]=(xs[x][y][Y+1]+val)%mod;
}
void div(int x,int y,ll val){
	val=ksm(val,mod-2,mod);
	for(int i=0;i<=Y+1;i++)xs[x][y][i]=xs[x][y][i]*val%mod;
}
ll calc(int x,int y){
	ll res=xs[x][y][Y+1];
	for(int i=0;i<=Y;i++)res=(res+mat[i+1][Y+2]*xs[x][y][i])%mod;
	return res;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		if(z==1)X++,d1[x]++,d1[y]++;
		else Y++,d2[x]++,d2[y]++;
	}
	int P=n*(n-1)/2-n+2,all=Getid(X,Y);ll iv=ksm(n,mod-2,mod);
	for(int i=0;i<=X;i++){
		for(int j=0;j<=Y;j++){
			if(i==X&&j==Y){
				mp[Getid(i,j)][Getid(i,j)]=1;
				continue;
			}
			int Q=n-i-j;
			mp[Getid(i,j)][Getid(i,j)]=(X+Y+Y)*P%mod;
			mp[Getid(i,j)][Getid(i,j)]=(mp[Getid(i,j)][Getid(i,j)]-(Q*(i+j+j)+(P-Q+1)*((X-i)+2*(Y-j)))%mod+mod)%mod;
			if(i)mp[Getid(i,j)][Getid(i-1,j)]=(mp[Getid(i,j)][Getid(i-1,j)]-(P-Q)*i%mod+mod)%mod;
			if(j)mp[Getid(i,j)][Getid(i,j-1)]=(mp[Getid(i,j)][Getid(i,j-1)]-2*(P-Q)*j%mod+mod)%mod;
			if(i<X)mp[Getid(i,j)][Getid(i+1,j)]=(mp[Getid(i,j)][Getid(i+1,j)]-(Q-1)*(X-i)%mod+mod)%mod;
			if(j<Y)mp[Getid(i,j)][Getid(i,j+1)]=(mp[Getid(i,j)][Getid(i,j+1)]-(Q-1)*2*(Y-j)%mod+mod)%mod;
			mp[Getid(i,j)][all+1]=(ll)(X+2*Y)*P%mod*iv%mod;
		}
	}
	for(int i=0;i<=Y;i++)xs[0][i][i]=1;
	for(int i=0;i<X;i++){
		for(int j=0;j<=Y;j++){
			add(i+1,j,mp[Getid(i,j)][all+1]);
			dec(i+1,j,i,j,mp[Getid(i,j)][Getid(i,j)]);
			if(i)dec(i+1,j,i-1,j,mp[Getid(i,j)][Getid(i-1,j)]);
			if(j)dec(i+1,j,i,j-1,mp[Getid(i,j)][Getid(i,j-1)]);
			if(j<Y)dec(i+1,j,i,j+1,mp[Getid(i,j)][Getid(i,j+1)]);
			div(i+1,j,mp[Getid(i,j)][Getid(i+1,j)]);
		}
	}
	for(int i=0;i<=Y;i++){
		ll val=mp[Getid(X,i)][Getid(X,i)];
		for(int j=0;j<=Y+1;j++)mat[i+1][j+1]=(mat[i+1][j+1]+xs[X][i][j]*val)%mod;
		if(X){
			val=mp[Getid(X,i)][Getid(X-1,i)];
			for(int j=0;j<=Y+1;j++)mat[i+1][j+1]=(mat[i+1][j+1]+xs[X-1][i][j]*val)%mod;
		}
		if(i){
			val=mp[Getid(X,i)][Getid(X,i-1)];
			for(int j=0;j<=Y+1;j++)mat[i+1][j+1]=(mat[i+1][j+1]+xs[X][i-1][j]*val)%mod;
		}
		if(i<Y){
			val=mp[Getid(X,i)][Getid(X,i+1)];
			for(int j=0;j<=Y+1;j++)mat[i+1][j+1]=(mat[i+1][j+1]+xs[X][i+1][j]*val)%mod;
		}
		mat[i+1][Y+2]=(mp[Getid(X,i)][all+1]-mat[i+1][Y+2]+mod)%mod;
	}
	gauss(Y+1);
	ll ans=0;
	for(int i=1;i<=n;i++)ans=(ans+calc(d1[i],d2[i]))%mod;
	ans=(ans-calc(X,Y)+mod)%mod;
	ans=(ans-calc(1,0)*X%mod+mod)%mod;
	ans=(ans-calc(0,1)*Y%mod+mod)%mod;
	printf("%lld",ans);
	return 0;
}
            
            
            
        