QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#723306#7895. Graph Partitioning 2TomorrowWA 123ms6636kbC++174.0kb2024-11-07 21:46:152024-11-07 21:46:16

Judging History

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

  • [2024-11-07 21:46:16]
  • 评测
  • 测评结果:WA
  • 用时:123ms
  • 内存:6636kb
  • [2024-11-07 21:46:15]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

#define C const
#define U unsigned
#define SC static
#define CE constexpr
#define TL template
#define TN typename
#define OP operator
#define pb push_back
#define ft first
#define sd second
#define mi (l + (r - l) / 2)
#define TTT TL<TN T = I>
#define BE(v) v.begin(), v.end()
#define VD void
#define I int
#define LL long long
#define STR string
using PII = pair<I, I>;
TTT using V = vector<T>;

#define FORX(v) for(auto& x : v)
#define FORV(v, i) for (I i = 0, _n = v.size(), x = _n ? v[0] : 0;i < _n;x = v[++i])
#define FOR(i, b, e)  for(auto i = b, _e = (decltype(i))e;i != _e; ++i)
#define FORR(i, b, e) for(auto i = b, _e = (decltype(i))e;i != _e; --i)
#define FUNC(T, f, ...) function<T(__VA_ARGS__)> f = [&](__VA_ARGS__)->T

TTT CE T inf() { return numeric_limits<T>::max() / 2; }
TTT VD setmin(T& a, C T& b) { if (b < a)a = b; }
TTT VD setmax(T& a, C T& b) { if (a < b)a = b; }
TTT VD fastpow(T& a, T b, LL i) { for (;i;i >>= 1, b *= b)if (i & 1)a *= b; }

#define OPD(T,S,op,...) \
T& OP op##= (C S& _){{__VA_ARGS__} return *this;}\
friend T OP op (C T& a, C S& b) {return T(a) op##= b;}
#define OPB(T,op,...) friend bool OP op (C T& a, C T& b) {return __VA_ARGS__;}
#define OST(T) friend ostream& OP << (ostream & os, C T & a) { return os << a.x; }
struct Mod//WARNING : Mod MUST BE assigned in [0,m)
{
	SC U I m; SC U LL i;
	SC VD set(U I mod) { m = mod, i = (U LL)(-1) / m + 1; }
	SC U I mul(U I a, U I b)
	{
		U LL x = (U LL)a * b, y = ((U __int128)x * i >> 64) * m;
		return x - y + (x < y ? m : 0);
	}
	U I x; CE Mod() :x(0) {}
	TTT CE Mod(T x) : x(x) {}
	OPD(Mod, Mod, +, if ((x += _.x) >= m)x -= m;);
	OPD(Mod, Mod, -, if ((x += m - _.x) >= m)x -= m;);
	OPD(Mod, Mod, *, x = mul(x, _.x););
	OPD(Mod, Mod, / , fastpow(*this, _, m - 2););//m must be a prime
	OPD(Mod, I, ^, fastpow(*this, *this, _ - 1 + (_ > 0 ? 0 : m - 1)););
	OST(Mod)
};
U I Mod::m; U LL Mod::i;


VD test()
{
	Mod::set(998244353);
	I n, k;	cin >> n >> k;
	V<V<I>> e(n + 1);
	FOR(i, 1, n)
	{
		I u, v; cin >> u >> v;
		e[u].pb(v), e[v].pb(u);
	}

	//if (k <= sqrt(n))
	if (0)
	{
		V<I> sz(n + 1);
		V<V<Mod>> f(n + 1, V<Mod>(k + 2));
		FUNC(VD, dfs, I p, I fa)
		{
			f[p][1] = 1;
			sz[p] = 1;
			FORX(e[p])
			{
				if (x == fa)continue;
				dfs(x, p);
				V<Mod> fp(k + 2);
				FOR(i, 1, k + 2)
				{
					if (i > sz[p])break;
					FOR(j, 1, sz[x] + 1)
					{
						if (i + j > k + 1)break;
						fp[i + j] += f[p][i] * f[x][j];
					}
					fp[i] += f[p][i] * (f[x][k] + f[x][k + 1]);
				}
				sz[p] += sz[x];
				f[p] = move(fp);
			}
		};
		dfs(1, 0);
		cout << f[1][k] + f[1][k + 1] << '\n';
	}
	else
	{
		I nk = n / k;
		FUNC(I, calc, I sz, I i, I is)
		{
			I si = sz - i * k;
			if (si > 0)
			{
				I r = si % (k + 1);
				if (is && r == 0)return k + 1;
				if (!is) return r ? r : k;
			}
			return -1;
		};
		V<V<V<Mod>>> f(n + 1, V<V<Mod>>(nk + 1, V<Mod>(2)));
		V<I> sz(n + 1);
		FUNC(VD, dfs, I p, I fa)
		{
			f[p][0][0] = 1;
			sz[p] = 1;
			FORX(e[p])
			{
				if (x == fa)continue;
				dfs(x, p);
				V<V<Mod>> fp(nk + 1, V<Mod>(2));
				FOR(i, 0, nk + 1)FOR(is, 0, 2)
				{
					I ir = calc(sz[p], i, is);
					if (ir == -1)continue;
					FOR(j, 0, nk + 1)FOR(js, 0, 2)
					{
						I jr = calc(sz[x], j, js);
						if (jr == -1)continue;

						if (ir + jr <= k + 1)fp[i + j][ir + jr == k + 1] += f[p][i][is] * f[x][j][js];
						if (jr == k || jr == k + 1)fp[i + j + 1][is] += f[p][i][is] * f[x][j][js];
					}
				}
				sz[p] += sz[x];
				f[p] = move(fp);
			}
		};
		dfs(1, 0);

		Mod ans;
		FOR(i, 0, nk + 1)
		{
			FOR(is, 0, 2)
			{
				I ir = calc(n, i, is);
				if (ir == k || ir == k + 1)
				{
					ans += f[1][i][is];
				}
			}
		}
		cout << ans << '\n';
	}

}

I main()
{
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	if (fopen("test.in", "r"))
	{
		freopen("test.in", "r", stdin);
		freopen("test.out", "w", stdout);
	}
	I t = 1;
	cin >> t;
	while (t--)test();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

2
8 2
1 2
3 1
4 6
3 5
2 4
8 5
5 7
4 3
1 2
1 3
2 4

output:

2
1

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 123ms
memory: 6636kb

input:

5550
13 4
10 3
9 1
10 8
3 11
8 5
10 7
9 6
13 5
9 7
2 7
5 12
4 8
8 2
4 1
3 4
7 8
2 5
6 7
4 8
2 3
11 1
11 10
1 4
9 10
8 4
3 6
5 7
6 1
10 2
11 7
11 1
17 2
14 16
13 15
17 3
15 11
1 6
13 2
13 17
4 8
14 10
8 14
14 5
9 12
14 2
12 17
17 6
15 7
14 6
2 14
2 13
2 4
8 4
3 11
7 3
14 1
11 9
13 3
5 10
6 8
3 10
14 ...

output:

1
4
50
0
0
0
0
0
0
0
1
0
1
0
0
1
0
41
0
0
0
103
1
4
0
0
0
2
0
158
0
1
1
0
0
1
1
0
0
12
411
0
1
373
0
0
1
0
120
1
251
121
4
30
0
1
0
18
0
1
0
0
0
0
0
1
0
1
0
2
1
1
38
0
0
0
0
0
0
0
0
0
1
1
0
1
1
0
0
0
1
0
0
0
14
0
2
0
0
0
3
82
0
80
0
0
17
0
1
0
0
0
0
1
2
0
0
1
0
0
4
0
1
0
0
0
1
0
0
0
0
1
2
1
0
1
0
29...

result:

wrong answer 1st lines differ - expected: '0', found: '1'