提出 #45322143


ソースコード 拡げる

#include <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<iomanip>
#include<ctime>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<bitset>
#include<cassert>
#define sqr(x) ((x)*(x))
#define fz1(i,n) for ((i)=1;(i)<=(n);(i)++)
#define fd1(i,n) for ((i)=(n);(i)>=1;(i)--)
#define fz0g(i,n) for ((i)=0;(i)<=(n);(i)++)
#define fd0g(i,n) for ((i)=(n);(i)>=0;(i)--)
#define fz0k(i,n) for ((i)=0;(i)<(n);(i)++)
#define fd0k(i,n) for ((i)=(((long long)(n))-1);(i)>=0;(i)--)
#define fz(i,x,y) for ((i)=(x);(i)<=(y);(i)++)
#define fd(i,y,x) for ((i)=(y);(i)>=(x);(i)--)
#define fzin fz1(i,n)
#define fzim fz1(i,m)
#define fzjn fz1(j,n)
#define fzjm fz1(j,m)
#define ff(c,itr) for (__typeof((c).begin()) itr=(c).begin();itr!=(c).end();++itr)
#define pb push_back
#define mk make_pair
#define rdst(st,len){static char ss[len];scanf(" %s",ss);(st)=ss;}
#define spln(i,n) (i==n?'\n':' ')
#define fac_init(n){fac[0]=fac[1]=inv[1]=fi[0]=fi[1]=1;fz(i,2,n){fac[i]=1ll*fac[i-1]*i%mod;inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;fi[i]=1ll*fi[i-1]*inv[i]%mod;}}
using namespace std;
typedef long long i64;
typedef long double f80;
typedef unsigned int u32;
typedef unsigned long long u64;
//typedef __int128 i128;
//typedef unsigned __int128 u128;
#ifndef ONLINE_JUDGE
	FILE *___=freopen("1.in","r",stdin);
#endif
inline void read(int &x)
{
	char c;int f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	x=(c&15);while(isdigit(c=getchar()))x=(x<<1)+(x<<3)+(c&15);
	x*=f;
}
const int mod=998244353;
int n,m,i,j,k,typ[155],cc[2],ans;
vector<int> bi[155];
void dfs1(int x,int p)
{
	cc[typ[x]=typ[p]^1]++;
	ff(bi[x],it)if(*it!=p){
		dfs1(*it,x);
	}
}
int f[155][305][2][2],nf[305][2][2];
void dfs2(int x,int p)
{
	f[x][typ[x]==1?n+1:n-1][0][0]=1;int i,j,a,b,c,d;
	ff(bi[x],it)if(*it!=p){
		dfs2(*it,x);memset(nf,0,sizeof(nf));
		fz(i,-n,n)fz0k(a,2)fz0k(b,2)if(f[x][i+n][a][b]){
			if(typ[*it]==0){
				nf[i+n][1][b]=(nf[i+n][1][b]+f[x][i+n][a][b])%mod;
			}
			else{
				nf[i+n][a][1]=(nf[i+n][a][1]+f[x][i+n][a][b])%mod;
			}
			fz(j,-n,n)fz0k(c,2)fz0k(d,2)if(f[*it][j+n][c][d]){
				nf[i+j+n][a|c][b|d]=(nf[i+j+n][a|c][b|d]+1ll*f[x][i+n][a][b]*f[*it][j+n][c][d])%mod;
			}
		}
		memcpy(f[x],nf,sizeof(nf));
	}
	fz0k(a,2)fz0k(b,2){
		if(!a&&(!p||typ[p]!=0)) continue;
		if(!b&&(!p||typ[p]!=1)) continue;
		ans=(ans+f[x][n+cc[1]-cc[0]][a][b])%mod;
	}
}
int sz0[155],sz1[155];
int dfn[155],dfe[155],mp[155],ti;
void dfs3(int x,int p)
{
	sz0[x]=sz1[x]=0;
	if(typ[x]==1) sz1[x]++; else sz0[x]++;
	mp[dfn[x]=++ti]=x;
	ff(bi[x],it)if(*it!=p){
		dfs3(*it,x);
		sz0[x]+=sz0[*it];
		sz1[x]+=sz1[*it];
	}
	dfe[x]=ti;
}
void dfs5(int x,int p)
{
	sz0[x]=sz1[x]=0;
	if(typ[x]==1) sz1[x]++; else sz0[x]++;
	ff(bi[x],it)if(*it!=p){
		dfs5(*it,x);
		sz0[x]+=sz0[*it];
		sz1[x]+=sz1[*it];
	}
}
bool dfs4(int x,int p,int c0,int c1)
{
	if(typ[x]==1) c1++; else c0++;
	c0--;c1--;
	int s0=0,s1=0;bool lf=1;
	ff(bi[x],it)if(*it!=p){
		s0+=sz0[*it];
		s1+=sz1[*it];
		lf=0;
	}
	if(lf) return 0;
	if(typ[x]==1){
		if(c1==0) return 1;
	}
	else{
		if(c0==0) return 1;
	}
	ff(bi[x],it)if(*it!=p){
		if(dfs4(*it,x,c0+s0-sz0[*it],c1+s1-sz1[*it])) return 1;
	}
	return 0;
}
int dp[155][155][155][2];
int res[155][155];
void solve(int nd)
{
	memset(dp,0,sizeof(dp));int c0=0,c1=0,i,j,k,p;
	dp[1][0][0][0]=1;
	fz(i,2,ti){
		int x=mp[i],to=dfe[x];
		fz0g(j,c0)fz0g(k,c1)fz0k(p,2)if(dp[i-1][j][k][p]){
			dp[i][j][k][p]=(dp[i][j][k][p]+dp[i-1][j][k][p])%mod;
			dp[to][j+sz0[x]][k+sz1[x]][p|(typ[x]==nd)]=(dp[to][j+sz0[x]][k+sz1[x]][p|(typ[x]==nd)]+dp[i-1][j][k][p])%mod;
		}
		c0+=(typ[x]==0);c1+=(typ[x]==1);
	}
	fz0g(j,c0)fz0g(k,c1){
		res[j][k]=(res[j][k]+dp[ti][j][k][1])%mod;
	}
}
int main()
{
	read(n);fz1(i,n-1){int x,y;read(x);read(y);bi[x].push_back(y);bi[y].push_back(x);}
	dfs1(1,0);
	if(cc[0]==cc[1]) ans=(ans+1)%mod;
	ans=(ans+1)%mod;
	dfs2(1,0);
	fz1(i,n){
		ff(bi[i],it){
			ti=0;fz1(j,n)dfn[j]=0;
			dfs3(i,*it);
			memset(res,0,sizeof(res));
			solve(typ[i]);
			int c0=0,c1=0;
			fz1(j,n)if(!dfn[j]){
				if(typ[j])c1++;
				else c0++;
			}
			dfs5(*it,i);
			fz0g(j,n)fz0g(k,n)if(res[j][k]&&j+c0==k+c1){
				if(dfs4(*it,i,j,k)){
					ans=(ans-res[j][k]+mod)%mod;
				}
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}

提出情報

提出日時
問題 C - Shrink the Tree
ユーザ csy2005
言語 C++ 20 (gcc 12.2)
得点 1500
コード長 4447 Byte
結果 AC
実行時間 555 ms
メモリ 33708 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1500 / 1500
結果
AC × 4
AC × 79
セット名 テストケース
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt, 01-037.txt, 01-038.txt, 01-039.txt, 01-040.txt, 01-041.txt, 01-042.txt, 01-043.txt, 01-044.txt, 01-045.txt, 01-046.txt, 01-047.txt, 01-048.txt, 01-049.txt, 01-050.txt, 01-051.txt, 01-052.txt, 01-053.txt, 01-054.txt, 01-055.txt, 01-056.txt, 01-057.txt, 01-058.txt, 01-059.txt, 01-060.txt, 01-061.txt, 01-062.txt, 01-063.txt, 01-064.txt, 01-065.txt, 01-066.txt, 01-067.txt, 01-068.txt, 01-069.txt, 01-070.txt, 01-071.txt, 01-072.txt, 01-073.txt, 01-074.txt, 01-075.txt
ケース名 結果 実行時間 メモリ
00-sample-001.txt AC 18 ms 32980 KiB
00-sample-002.txt AC 20 ms 32976 KiB
00-sample-003.txt AC 27 ms 33004 KiB
00-sample-004.txt AC 62 ms 32988 KiB
01-001.txt AC 14 ms 32964 KiB
01-002.txt AC 364 ms 33544 KiB
01-003.txt AC 172 ms 33140 KiB
01-004.txt AC 323 ms 33408 KiB
01-005.txt AC 85 ms 32976 KiB
01-006.txt AC 158 ms 33208 KiB
01-007.txt AC 442 ms 33472 KiB
01-008.txt AC 70 ms 33144 KiB
01-009.txt AC 463 ms 33476 KiB
01-010.txt AC 204 ms 33256 KiB
01-011.txt AC 453 ms 33468 KiB
01-012.txt AC 73 ms 33100 KiB
01-013.txt AC 247 ms 33452 KiB
01-014.txt AC 209 ms 33424 KiB
01-015.txt AC 163 ms 33280 KiB
01-016.txt AC 234 ms 33468 KiB
01-017.txt AC 450 ms 33452 KiB
01-018.txt AC 31 ms 32912 KiB
01-019.txt AC 66 ms 32940 KiB
01-020.txt AC 80 ms 32984 KiB
01-021.txt AC 25 ms 32900 KiB
01-022.txt AC 123 ms 33088 KiB
01-023.txt AC 451 ms 33556 KiB
01-024.txt AC 373 ms 33596 KiB
01-025.txt AC 359 ms 33516 KiB
01-026.txt AC 390 ms 33612 KiB
01-027.txt AC 481 ms 33568 KiB
01-028.txt AC 435 ms 33512 KiB
01-029.txt AC 536 ms 33636 KiB
01-030.txt AC 441 ms 33668 KiB
01-031.txt AC 555 ms 33576 KiB
01-032.txt AC 520 ms 33708 KiB
01-033.txt AC 508 ms 33520 KiB
01-034.txt AC 434 ms 33620 KiB
01-035.txt AC 543 ms 33648 KiB
01-036.txt AC 506 ms 33496 KiB
01-037.txt AC 498 ms 33496 KiB
01-038.txt AC 435 ms 33548 KiB
01-039.txt AC 536 ms 33620 KiB
01-040.txt AC 504 ms 33612 KiB
01-041.txt AC 414 ms 33508 KiB
01-042.txt AC 479 ms 33512 KiB
01-043.txt AC 399 ms 33588 KiB
01-044.txt AC 459 ms 33520 KiB
01-045.txt AC 467 ms 33700 KiB
01-046.txt AC 364 ms 33696 KiB
01-047.txt AC 352 ms 33564 KiB
01-048.txt AC 395 ms 33600 KiB
01-049.txt AC 476 ms 33660 KiB
01-050.txt AC 428 ms 33564 KiB
01-051.txt AC 525 ms 33500 KiB
01-052.txt AC 426 ms 33540 KiB
01-053.txt AC 551 ms 33684 KiB
01-054.txt AC 509 ms 33564 KiB
01-055.txt AC 505 ms 33660 KiB
01-056.txt AC 433 ms 33580 KiB
01-057.txt AC 549 ms 33472 KiB
01-058.txt AC 491 ms 33500 KiB
01-059.txt AC 495 ms 33512 KiB
01-060.txt AC 425 ms 33544 KiB
01-061.txt AC 549 ms 33600 KiB
01-062.txt AC 488 ms 33644 KiB
01-063.txt AC 413 ms 33560 KiB
01-064.txt AC 490 ms 33508 KiB
01-065.txt AC 390 ms 33644 KiB
01-066.txt AC 469 ms 33548 KiB
01-067.txt AC 459 ms 33652 KiB
01-068.txt AC 529 ms 33548 KiB
01-069.txt AC 507 ms 33648 KiB
01-070.txt AC 507 ms 33648 KiB
01-071.txt AC 481 ms 33568 KiB
01-072.txt AC 516 ms 33644 KiB
01-073.txt AC 482 ms 33648 KiB
01-074.txt AC 487 ms 33660 KiB
01-075.txt AC 489 ms 33644 KiB