| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| static const long long P = 998244353; |
|
|
| |
| |
|
|
| int main() { |
| for (int d = 3; d <= 10; d++) { |
| |
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
|
|
| unordered_set<long long> std_vals, gen_vals; |
|
|
| |
| { |
| vector<int> gy(d, 0); |
| while (true) { |
| long long Sv[15]; Sv[0] = 0; |
| for (int j = 0; j < d; j++) { |
| long long c = ((Sv[j] - Sv[gy[j]] + (j - gy[j]) + 1) % P + P) % P; |
| Sv[j + 1] = (Sv[j] + c) % P; |
| } |
| long long T = (Sv[d] + d + 1) % P; |
| std_vals.insert(T); |
|
|
| int pos = d - 1; |
| while (pos >= 0) { gy[pos]++; if (gy[pos] <= pos) break; gy[pos] = 0; pos--; } |
| if (pos < 0) break; |
| } |
| } |
|
|
| |
| |
| { |
| |
| int maxVal = d; |
| mt19937 rng(42); |
| int samples = min((long long)10000000, (long long)1); |
| |
| |
| |
| |
| long long total = 1; |
| for (int i = 0; i < d; i++) { |
| total *= (long long)d * (i + 1); |
| if (total > 100000000) break; |
| } |
|
|
| if (total <= 100000000) { |
| |
| |
| vector<int> pv(d, 1), pg(d, 0); |
|
|
| long long count = 0; |
| while (true) { |
| |
| |
| int nstates = (d + 1) * (maxVal + 1); |
| vector<int> dest(nstates, -2); |
| vector<long long> cost(nstates, 0); |
| vector<int8_t> st(nstates, 0); |
| bool cycle = false; |
|
|
| function<pair<int,long long>(int,int)> solve = [&](int i, int x) -> pair<int,long long> { |
| int id = i * (maxVal + 1) + x; |
| if (st[id] == 2) return {dest[id], cost[id]}; |
| if (st[id] == 1) { cycle = true; return {-2, 0}; } |
| st[id] = 1; |
| int dd; long long cc; |
| if (i < d) { |
| if (x == i + 1) { dd = i + 1; cc = 1; } |
| else { |
| auto [j, u] = solve(pg[i], pv[i]); |
| if (cycle) return {-2, 0}; |
| if (j < 0 || j > d) { cycle = true; return {-2, 0}; } |
| auto [k, v] = solve(j, x); |
| if (cycle) return {-2, 0}; |
| dd = k; cc = (u + v + 1) % P; |
| } |
| } else { |
| if (x == 0) { dd = -1; cc = 1; } |
| else { |
| |
| auto [j, u] = solve(d - 1, 1); |
| if (cycle) return {-2, 0}; |
| if (j < 0 || j > d) { cycle = true; return {-2, 0}; } |
| auto [k, v] = solve(j, x); |
| if (cycle) return {-2, 0}; |
| dd = k; cc = (u + v + 1) % P; |
| } |
| } |
| st[id] = 2; dest[id] = dd; cost[id] = cc; |
| return {dd, cc}; |
| }; |
|
|
| auto [_, T] = solve(0, 0); |
| if (!cycle) gen_vals.insert(T); |
|
|
| count++; |
| if (count % 5000000 == 0) cerr << "d=" << d << " count=" << count << "/" << total << endl; |
|
|
| |
| int pos = d - 1; |
| while (pos >= 0) { |
| |
| pg[pos]++; |
| if (pg[pos] <= pos) break; |
| pg[pos] = 0; |
| pv[pos]++; |
| if (pv[pos] <= d) break; |
| pv[pos] = 1; |
| pos--; |
| } |
| if (pos < 0) break; |
| } |
| } else { |
| cerr << "d=" << d << ": too many configs (" << total << "), sampling" << endl; |
| for (int s = 0; s < 10000000; s++) { |
| vector<int> pv(d), pg(d); |
| for (int i = 0; i < d; i++) { |
| pv[i] = 1 + rng() % d; |
| pg[i] = rng() % (i + 1); |
| } |
| int maxVal2 = d; |
| int nstates = (d + 1) * (maxVal2 + 1); |
| vector<int> dest(nstates, -2); |
| vector<long long> cost(nstates, 0); |
| vector<int8_t> st(nstates, 0); |
| bool cycle = false; |
| function<pair<int,long long>(int,int)> solve = [&](int i, int x) -> pair<int,long long> { |
| int id = i * (maxVal2 + 1) + x; |
| if (st[id] == 2) return {dest[id], cost[id]}; |
| if (st[id] == 1) { cycle = true; return {-2, 0}; } |
| st[id] = 1; |
| int dd; long long cc; |
| if (i < d) { |
| if (x == i + 1) { dd = i + 1; cc = 1; } |
| else { |
| auto [j, u] = solve(pg[i], pv[i]); |
| if (cycle) return {-2, 0}; |
| if (j < 0 || j > d) { cycle = true; return {-2, 0}; } |
| auto [k, v] = solve(j, x); |
| if (cycle) return {-2, 0}; |
| dd = k; cc = (u + v + 1) % P; |
| } |
| } else { |
| if (x == 0) { dd = -1; cc = 1; } |
| else { |
| auto [j, u] = solve(d - 1, 1); |
| if (cycle) return {-2, 0}; |
| if (j < 0 || j > d) { cycle = true; return {-2, 0}; } |
| auto [k, v] = solve(j, x); |
| if (cycle) return {-2, 0}; |
| dd = k; cc = (u + v + 1) % P; |
| } |
| } |
| st[id] = 2; dest[id] = dd; cost[id] = cc; |
| return {dd, cc}; |
| }; |
| auto [_, T] = solve(0, 0); |
| if (!cycle) gen_vals.insert(T); |
| } |
| } |
| } |
|
|
| cout << "d=" << d << ": std=" << std_vals.size() << " gen=" << gen_vals.size() << endl; |
| } |
| return 0; |
| } |
|
|