QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#723306 | #7895. Graph Partitioning 2 | Tomorrow | WA | 123ms | 6636kb | C++17 | 4.0kb | 2024-11-07 21:46:15 | 2024-11-07 21:46:16 |
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;
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'