AtCoder Regular Contest 106 に参加しました。
成績
A - 106
問題概要: を満たす正の整数の組
を一組求めよ(存在しなければ
を出力) 。
制約:
こういうやつは変に数学せずに全探索した方がいいって歴史の教科書に書いてました。オーバーフローに気を使いたくないので雑に Python でやる。

コードを表示
n = int(input()) for a in range(1,40): for b in range(1,30): if 3 ** a + 5 ** b == n: print(a, b) exit() print(-1)
B - Values
問題概要:(操作)辺を一つ選ぶ。選んだ辺が頂点
・値
・値
制約:
どちらの操作を選んでも
コードを表示
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define sz(x) int(x.size()) using namespace std; using ll = long long; struct UnionFind { vector<int> data; UnionFind(int size) : data(size, -1) { } int root(int x) { return (data[x] < 0) ? x : data[x] = root(data[x]); } bool unite(int x, int y) { x = root(x); y = root(y); if (x != y) { if (data[y] < data[x]) swap(x, y); data[x] += data[y]; data[y] = x; } return x != y; } bool find(int x, int y) { return root(x) == root(y); } int size(int x) { return -data[root(x)]; } }; int main() { int n, m; cin >> n >> m; vector<ll> a(n), b(n); rep(i, n) cin >> a[i]; rep(i, n) cin >> b[i]; UnionFind uf(n); while (m--) { int c, d; cin >> c >> d; uf.unite(--c, --d); } vector<ll> aa(n), bb(n); rep(i, n) { aa[uf.root(i)] += a[i]; bb[uf.root(i)] += b[i]; } cout << (aa == bb ? "Yes\n" : "No\n"); }
C - Solutions
問題 & 制約:(リンク)
(
(
(
コードを表示
#include <bits/stdc++.h> using namespace std; const int INF = 1e8; int main() { int n, m; cin >> n >> m; if (m < 0) { cout << -1 << '\n'; return 0; } if (m == 0) { for (int i = 1; i <= n; i++) { cout << 2 * i << ' ' << 2 * i + 1 << '\n'; } return 0; } if (m > 0) { if (m >= n - 1) { cout << -1 << '\n'; return 0; } for (int l = 1; l <= n - m - 1; l++) { cout << l << ' ' << l + INF << '\n'; } for (int i = 1; i <= m + 1; i++) { int l = n - m - 1 + 2 * i; int r = l + 1; cout << l << ' ' << r << '\n'; } return 0; } }
D - Powers
問題概要:整数列制約:

コードを表示
#include <bits/stdc++.h> #include <atcoder/modint> #define rep(i, n) for (int i = 0; i < (int)(n); i++) using namespace std; using mint = atcoder::modint998244353; int main() { const int N = 200200; vector<mint> fact(N + 1), ifact(N + 1); fact[0] = 1; for (int i = 1; i <= N; i++) { fact[i] = fact[i - 1] * i; } ifact[N] = fact[N].inv(); for (int i = N; i >= 1; i--) { ifact[i - 1] = ifact[i] * i; } auto comb = [&](int n, int r) { if (n < r || r < 0) return mint(0); return fact[n] * ifact[r] * ifact[n - r]; }; int n, k; cin >> n >> k; vector<mint> a(n); vector<mint> f(k + 1); f[0] = mint(n); rep(i, n) { int x; cin >> x; a[i] = mint(x); f[1] += a[i]; } auto b = a; for (int i = 2; i <= k; i++) { rep(j, n) { f[i] += b[j] * a[j]; b[j] *= a[j]; } } for (int x = 1; x <= k; x++) { mint ans = 0; for (int i = 0; i <= x; i++) { ans += comb(x, i) * f[i] * f[x - i]; } ans -= mint(2).pow(x) * f[x]; ans /= 2; cout << ans.val() << '\n'; } }
E - Medals, F - Figures
todoところで

今年も残すところあと二ヶ月!w GPAはなんか3ぐらいしかないです。オワオワリ