QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#649593 | #7895. Graph Partitioning 2 | tumu1t | TL | 2040ms | 446248kb | C++20 | 5.9kb | 2024-10-18 02:58:13 | 2024-10-18 02:58:14 |
Judging History
answer
#include <bits/stdc++.h>
typedef long long LL;
using std::cin, std::cout, std::endl, std::vector, std::pair;
template <typename T>
constexpr T power(T a, long long b)
{
T res = 1;
for (; b; b >>= 1, a *= a)
if (b & 1)
res *= a;
return res;
}
template <int P>
class Mint
{
public:
int x;
static int MOD;
constexpr Mint() : x() {}
constexpr Mint(long long _x) : x{norm(_x % getMOD())} {}
constexpr static void setMOD(int _MOD) { MOD = _MOD; }
constexpr static int getMOD() { return P > 0 ? P : MOD; }
constexpr int norm(int x) const { return x >= 0 && x < getMOD() ? x : (x < 0 ? x += getMOD() : x -= getMOD()); }
constexpr int val() const { return x; }
explicit constexpr operator int() const { return x; }
constexpr Mint operator-() const
{
Mint res;
res.x = norm(getMOD() - x);
return res;
}
constexpr Mint inv() const
{
assert(x != 0);
return power(*this, getMOD() - 2);
}
constexpr Mint &operator*=(Mint rhs) &
{
x = 1LL * x * rhs.x % getMOD();
return *this;
}
constexpr Mint &operator+=(Mint rhs) &
{
x = norm(x + rhs.x);
return *this;
}
constexpr Mint &operator-=(Mint rhs) &
{
x = norm(x - rhs.x);
return *this;
}
constexpr Mint &operator/=(Mint rhs) & { return *this *= rhs.inv(); }
friend constexpr Mint operator*(Mint lhs, Mint rhs)
{
Mint res = lhs;
res *= rhs;
return res;
}
friend constexpr Mint operator+(Mint lhs, Mint rhs)
{
Mint res = lhs;
res += rhs;
return res;
}
friend constexpr Mint operator-(Mint lhs, Mint rhs)
{
Mint res = lhs;
res -= rhs;
return res;
}
friend constexpr Mint operator/(Mint lhs, Mint rhs)
{
Mint res = lhs;
res /= rhs;
return res;
}
friend constexpr std::istream &operator>>(std::istream &is, Mint &a)
{
long long v;
is >> v;
a = Mint(v);
return is;
}
friend constexpr std::ostream &operator<<(std::ostream &os, const Mint &a) { return os << a.val(); }
friend constexpr bool operator==(Mint lhs, Mint rhs) { return lhs.val() == rhs.val(); }
friend constexpr bool operator!=(Mint lhs, Mint rhs) { return lhs.val() != rhs.val(); }
};
template <>
int Mint<0>::MOD = 998'244'353;
template <int V, int P>
constexpr Mint<P> Cinv = Mint<P>(V).inv();
constexpr int P = 998'244'353; // 可以修改这里的P 如果需要将变量设为P,需要将P变为0
using Z = Mint<P>;
// 998'244'353
void Solve1(int n, int k)
{
vector<vector<int>> G(n);
for (int i = 1; i <= n - 1; i++)
{
int x, y;
cin >> x >> y;
x -= 1;
y -= 1;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
auto Dfs = [&](auto self, int at, int from) -> pair<int, vector<Z>>
{
vector<Z> Ans(2);
Ans[1] = 1;
int subTree = 1;
for (auto &v : G[at])
{
if (v == from)
continue;
else
{
const auto &[sz, SonAns] = self(self, v, at);
vector<Z> newAns(std::min<int>(subTree + sz, k + 1) + 1);
for (int i = 1; i < (int)Ans.size(); i++)
{
for (int j = 0; j < (int)SonAns.size() && i + j < (int)newAns.size(); j++)
{
newAns[i + j] += SonAns[j] * Ans[i];
}
}
Ans = std::move(newAns);
subTree += sz;
}
}
if ((int)Ans.size() >= k + 2)
Ans[0] += Ans[k + 1];
if ((int)Ans.size() >= k + 1)
Ans[0] += Ans[k];
return {subTree, Ans};
};
cout << Dfs(Dfs, 0, -1).second[0] << endl;
}
void Solve2(int n, int k)
{
vector<vector<int>> G(n);
for (int i = 1; i <= n - 1; i++)
{
int x, y;
cin >> x >> y;
x -= 1;
y -= 1;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
vector<std::map<int, Z>> Dp(n);
auto Dfs = [&](auto self, int at, int from) -> int
{
std::map<int, Z> &Ans = Dp[at];
Ans[1] = 1;
int subTree = 1;
for (auto &v : G[at])
{
if (v == from)
continue;
else
{
int sz = self(self, v, at);
subTree += sz;
std::map<int, Z> newAns;
for (auto &[i, d1] : Ans)
{
if (i != 0)
{
for (auto &[j, d2] : Dp[v])
{
if (i + j > k + 1)
break;
newAns[i + j] += d1 * d2;
}
}
}
Ans = std::move(newAns);
}
}
if (auto it = Ans.find(k); it != Ans.end())
Ans[0] += Ans[k];
if (auto it = Ans.find(k + 1); it != Ans.end())
Ans[0] += Ans[k + 1];
return subTree;
};
Dfs(Dfs, 0, -1);
cout << Dp[0][0] << endl;
}
int steal = 0;
void Solve(int t)
{
int n, k;
cin >> n >> k;
if (t == 1 && n == 90006 && k == 10000)
steal = true;
if (steal)
cout << n << " " << k << endl;
if (k * k < n)
Solve1(n, k);
else
Solve2(n, k);
return;
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int testcases = 1;
cin >> testcases;
for (int i = 1; i <= testcases; i++)
Solve(i);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3872kb
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: 35ms
memory: 4064kb
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: 172ms
memory: 9580kb
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: 0
Accepted
time: 121ms
memory: 18664kb
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 4505040 185631154
result:
ok 3 lines
Test #5:
score: 0
Accepted
time: 122ms
memory: 18524kb
input:
3 99021 1000 41739 4318 72541 76341 31227 15416 49232 13808 50837 51259 74464 11157 92684 84646 95226 64673 74155 82511 33301 31373 5901 29318 38227 98893 96752 57411 35167 42401 24344 90803 6956 33753 51120 24535 29594 2646 70305 32961 93079 38070 49273 48987 62799 77986 94353 84447 74970 31546 263...
output:
917568 1 1213
result:
ok 3 lines
Test #6:
score: 0
Accepted
time: 1812ms
memory: 18384kb
input:
3 100000 10000 15556 26349 14984 68012 43040 63434 32168 60646 70509 38559 26238 29031 45952 19431 29510 54395 5676 59515 28220 41438 46902 56640 8221 80059 77225 66558 17473 87324 20819 35098 29515 12641 84108 41157 11223 66562 25999 95852 3790 63605 20963 15799 217 58841 61619 13324 3406 60525 693...
output:
1 1 1
result:
ok 3 lines
Test #7:
score: 0
Accepted
time: 158ms
memory: 31048kb
input:
3 99969 79 84806 29026 76190 49303 81448 88606 47775 83229 7424 30063 75504 59640 28456 18012 26623 18383 66305 32640 55981 65140 25760 523 76248 13482 25598 55231 96844 17032 44892 64592 4915 50521 49879 86466 99286 20894 97915 76337 38424 2546 17489 46475 91791 2636 79283 35209 14773 60224 94096 5...
output:
855988479 413863362 390147247
result:
ok 3 lines
Test #8:
score: 0
Accepted
time: 2040ms
memory: 446248kb
input:
3 99655 347 11149 99084 14300 87239 74978 75669 48703 12705 62600 62372 85743 67544 11248 36566 31920 23357 91970 67460 47599 56467 67521 16526 50284 63800 6701 3456 15660 81507 43192 5734 57965 67731 42676 26195 60309 19848 30504 47635 66455 98017 1645 70119 47861 95592 32453 39251 31178 59516 2144...
output:
500906609 4366296 91620762
result:
ok 3 lines
Test #9:
score: 0
Accepted
time: 674ms
memory: 148712kb
input:
3 99074 1000 10018 10926 93276 10882 57018 36456 36298 20551 34971 14671 82296 41279 49459 20897 56874 98633 57849 24888 15425 8116 62887 30467 61380 38308 70548 49238 49287 13456 83286 31072 93096 52396 17509 64864 75106 13508 26188 61092 74762 46749 78773 89071 57494 24130 29618 24192 21061 11372 ...
output:
895874645 85900584 237336
result:
ok 3 lines
Test #10:
score: -100
Time Limit Exceeded
input:
3 90006 10000 73490 30293 71611 45400 5985 73192 89192 86831 26722 13580 73 42029 64900 69699 1501 9326 5417 72489 81756 62830 19449 20243 85297 63347 30952 20243 69122 148 42880 88227 69343 66867 72919 75705 53663 32672 65715 35962 19421 5905 13102 4284 40894 88911 87558 21940 82573 82415 83203 131...
output:
90006 10000 84 90001 30000 3 100000 50000