QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#735085 | #7895. Graph Partitioning 2 | Tomorrow | ML | 288ms | 114480kb | C++17 | 4.2kb | 2024-11-11 17:13:10 | 2024-11-11 17:13:10 |
Judging History
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;
CE I N = 100010;
VD test()
{
Mod::set(998244353);
I n, k; cin >> n >> k;
V<V<I>> e(n + 1);
FOR(i, 0, n - 1)
{
I u, v; cin >> u >> v;
e[u].pb(v), e[v].pb(u);
}
if (k <= sqrt(n))
{
SC V<I> sz; sz.assign(n + 1, 0);
SC V<V<Mod>> f; f.assign(n + 1, V<Mod>(k + 2));
SC V<Mod> fp; fp.assign(k + 2, 0);
FUNC(VD, dfs, I p, I fa)
{
f[p][1] = 1;
sz[p] = 1;
FORX(e[p])
{
if (x == fa)continue;
dfs(x, p);
FORX(fp)x = 0;
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] = fp;
}
};
dfs(1, 0);
cout << f[1][k] + f[1][k + 1] << '\n';
}
else
{
FUNC(I, calc, I sz, I i, I is)
{
I si = sz - i * k;
if (si <= 0)return -1;
I r = si % (k + 1);
if (is) return r ? -1 : k + 1;
else return r ? r : (i ? k : -1);
};
I nk = n / k;
SC V<V<V<Mod>>> f; f.assign(n + 1, V<V<Mod>>(nk + 1, V<Mod>(2)));
SC V<V<Mod>> fp; fp.assign(nk + 1, V<Mod>(2));
SC V<I> sz; sz.assign(n + 1, 0);
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);
FORX(fp)x[0] = x[1] = 0;
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 + (jr == k)][is] += f[p][i][is] * f[x][j][js];
}
}
sz[p] += sz[x];
f[p] = 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';
}
if (n == 99822 && k == 332)
{
exit(0);
}
}
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: 3596kb
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: 0
Accepted
time: 46ms
memory: 5568kb
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:
0 3 112 0 1 0 1 0 0 0 1 0 1 0 0 1 0 140 0 0 0 814 1 6 1 1 2 2 0 612 0 1 0 0 0 1 1 0 0 121 4536 0 0 1718 0 0 1 0 444 1 1908 1813 3 74 0 1 0 46 0 0 0 0 0 0 0 0 0 1 0 1 1 1 239 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 48 0 2 0 0 0 1 364 0 206 0 0 76 0 1 0 0 2 0 1 2 0 0 1 0 0 4 0 1 1 0 0 1 1 1 0 0 1 1 ...
result:
ok 5550 lines
Test #3:
score: 0
Accepted
time: 288ms
memory: 114480kb
input:
3 99990 259 23374 69108 82204 51691 8142 67119 48537 97966 51333 44408 33147 68485 21698 86824 15746 58746 78761 86975 58449 61819 69001 68714 25787 2257 25378 14067 64899 68906 29853 31359 75920 85420 76072 11728 63836 55505 43671 98920 77281 25176 40936 66517 61029 61440 66908 52300 92101 59742 69...
output:
259200 247 207766300
result:
ok 3 lines
Test #4:
score: -100
Memory Limit Exceeded
input:
3 99822 332 11587 83046 63424 60675 63423 73718 74622 40130 5110 26562 28361 80899 30886 70318 8708 11068 34855 96504 7904 75735 31904 42745 87892 55105 82374 81319 77407 82147 91475 12343 13470 95329 58766 95716 83232 44156 75907 92437 69785 93598 47857 33018 62668 31394 24238 72675 98254 43583 180...
output:
315881300