QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#719805#7509. 01tree369PaiTL 33ms14196kbC++232.0kb2024-11-07 09:05:162024-11-07 09:05:16

Judging History

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

  • [2024-11-07 09:05:16]
  • 评测
  • 测评结果:TL
  • 用时:33ms
  • 内存:14196kb
  • [2024-11-07 09:05:16]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5 , MOD = 1e9 + 7;
int n , res , a[N] , b[N] , ca[N][3] , cb[N][3];
string aa , bb; vector<int>e[N];
int Qpow(ll x , ll p)
{
	ll res = 1;
	x %= MOD , p %= MOD - 1;
	if(p < 0)p += MOD - 1;
	for(; p ; p >>= 1 , x = x * x % MOD) 
		if(p & 1)res = res * x % MOD;
	return res;
}
int fac[N * 2] , ifac[N * 2];
void Init(int n)
{
	fac[0] = ifac[0] = 1;
	for(int i = 1 ; i <= n ; i++)
		fac[i] = (ll)fac[i - 1] * i % MOD;
	ifac[n] = Qpow(fac[n] , MOD - 2);
	for(int i = n - 1 ; i >= 1 ; i--)
		ifac[i] = (ll)ifac[i + 1] * (i + 1) % MOD;
}
int C(int n , int m)
{
	if(n < m || m < 0)return 0;
	return (ll)fac[n] * ifac[m] % MOD * ifac[n - m] % MOD;
}
void Dfs(int u , int fa , int dep = 1)
{
	if(a[u] != -1)a[u] ^= (dep & 1);
	ca[u][a[u] + 1]++;
	if(b[u] != -1)b[u] ^= (dep & 1);
	cb[u][b[u] + 1]++;
	for(int v : e[u])
	{
		if(v == fa)continue ;
		Dfs(v , u , dep + 1);
		for(int i = 0 ; i < 3 ; i++)
		{
			ca[u][i] += ca[v][i];
			cb[u][i] += cb[v][i];
		}
	}
}
int Solve()
{
	cin >> n; 
	for(int i = 1 ; i <= n ; i++)e[i].clear();
	for(int i = 1 ; i < n ; i++)
	{
		int u , v; cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	cin >> aa >> bb;
	for(int i = 0 ; i < n ; i++)
	{
		a[i + 1] = aa[i] == '?' ? -1 : aa[i] - '0';
		b[i + 1] = bb[i] == '?' ? -1 : bb[i] - '0';
	}
	memset(ca , 0 , sizeof(int) * (n + 1) * 3);
	memset(cb , 0 , sizeof(int) * (n + 1) * 3);
	Dfs(1 , 0);
	int A = ca[1][0] , B = cb[1][0] , Z = ca[1][2] - cb[1][2] , ans = 0;
	// cerr << A << " " << B << " " << Z << "\n";
	for(int u = 1 ; u <= n ; u++)
	{
		int x = ca[u][0] , y = cb[u][0] , z = ca[u][2] - cb[u][2];
		for(int p = -y ; p <= x ; p++)
			ans = (ans + (ll)C(x + y , x - p) * C(A + B - x - y , A - x + Z + p) % MOD * abs(z + p)) % MOD;
	}
	cout << ans << "\n";
	return 0;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0) , cout.tie(0);
	Init(2e5); int T; cin >> T;
	while(T--)Solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

3
2
1 2
00
11
3
1 2
2 3
???
???
3
1 2
2 3
??1
0?0

output:

1
16
1

result:

ok 3 number(s): "1 16 1"

Test #2:

score: 0
Accepted
time: 5ms
memory: 10404kb

input:

1000
23
1 2
1 3
1 4
2 5
5 6
4 7
3 8
4 9
8 10
8 11
8 12
1 13
7 14
10 15
7 16
7 17
5 18
18 19
12 20
9 21
21 22
6 23
00?10?0000??1?00111?010
011??1?10?01?110?0??101
6
1 2
1 3
1 4
4 5
3 6
000?10
1???01
25
1 2
2 3
2 4
4 5
5 6
2 7
4 8
5 9
7 10
8 11
11 12
5 13
11 14
3 15
6 16
14 17
1 18
4 19
6 20
4 21
5 22...

output:

53545
24
11724
2228
162
14
711
28
550
1680
52
2
13
988
9480
2342
626416
0
71780
1
88
39207
19448
4
37395
9602
3253496
38057200
1066
3
303732
1608
281022
11718
170
78
15
1219376
29364
9092
7
0
2
7014
1942448
170371
75845
167217
16554
64
904
564290
14822
1127090
1758504
1227646
14833316
14954550
36055...

result:

ok 1000 numbers

Test #3:

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

input:

1
3000
1 2
2 3
2 4
1 5
3 6
2 7
5 8
8 9
9 10
10 11
2 12
11 13
7 14
11 15
7 16
13 17
8 18
1 19
11 20
10 21
18 22
7 23
7 24
15 25
23 26
24 27
14 28
15 29
25 30
16 31
6 32
10 33
3 34
30 35
16 36
9 37
36 38
28 39
26 40
33 41
1 42
11 43
20 44
23 45
14 46
31 47
41 48
11 49
48 50
45 51
6 52
10 53
32 54
38 5...

output:

924036898

result:

ok 1 number(s): "924036898"

Test #4:

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

input:

1
3000
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
5 10
5 11
6 12
6 13
7 14
7 15
8 16
8 17
9 18
9 19
10 20
10 21
11 22
11 23
12 24
12 25
13 26
13 27
14 28
14 29
15 30
15 31
16 32
16 33
17 34
17 35
18 36
18 37
19 38
19 39
20 40
20 41
21 42
21 43
22 44
22 45
23 46
23 47
24 48
24 49
25 50
25 51
26 52
26 53
27 54
2...

output:

429465738

result:

ok 1 number(s): "429465738"

Test #5:

score: 0
Accepted
time: 22ms
memory: 10676kb

input:

1
3000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 52
52 5...

output:

650625747

result:

ok 1 number(s): "650625747"

Test #6:

score: 0
Accepted
time: 33ms
memory: 14196kb

input:

1
100000
1 2
1 3
3 4
1 5
2 6
6 7
2 8
1 9
6 10
1 11
3 12
11 13
5 14
9 15
12 16
6 17
13 18
13 19
14 20
7 21
14 22
21 23
12 24
17 25
14 26
3 27
4 28
8 29
22 30
12 31
6 32
30 33
4 34
15 35
12 36
3 37
20 38
7 39
37 40
5 41
13 42
34 43
9 44
27 45
39 46
43 47
3 48
17 49
36 50
12 51
1 52
45 53
35 54
15 55
2...

output:

143309878

result:

ok 1 number(s): "143309878"

Test #7:

score: 0
Accepted
time: 27ms
memory: 14052kb

input:

1
100000
1 2
1 3
2 4
2 5
3 6
3 7
4 8
4 9
5 10
5 11
6 12
6 13
7 14
7 15
8 16
8 17
9 18
9 19
10 20
10 21
11 22
11 23
12 24
12 25
13 26
13 27
14 28
14 29
15 30
15 31
16 32
16 33
17 34
17 35
18 36
18 37
19 38
19 39
20 40
20 41
21 42
21 43
22 44
22 45
23 46
23 47
24 48
24 49
25 50
25 51
26 52
26 53
27 54...

output:

724432513

result:

ok 1 number(s): "724432513"

Test #8:

score: -100
Time Limit Exceeded

input:

1
100000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 52
52...

output:


result: