for
ループを理解していれば簡単。#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = n; i >= 0; --i) cout << i << '\n';
return 0;
}
A
~ Z
1
~ 9
0
~ 9
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
// S が 8 文字でない or
// 1 文字目が、'A' ~ 'Z' でない or
// 8 文字目が、'A' ~ 'Z' でない or
// 2 文字目が、'1' ~ '9' でないなら
// "No" を出力
if (s.length() != 8 || !('A' <= s[0] && s[0] <= 'Z') ||
!('A' <= s[7] && s[7] <= 'Z') || !('1' <= s[1] && s[1] <= '9')) {
cout << "No";
return 0;
}
// 3 ~ 7 文字目が、'0' ~ '9' でないなら
// "No" を出力
for (int i = 2; i < 7; ++i) {
if (!('0' <= s[i] && s[i] <= '9')) {
cout << "No";
return 0;
}
}
// すべての条件を満たすなら "Yes" を出力
cout << "Yes";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n;
ll t, sum = 0;
cin >> n >> t;
vector<ll> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
sum += a[i];
}
t %= sum; // 全曲の時間の総和で割る
// 「何番目の曲が流れているか」と「流れている時間」を計算
for (int i = 0; i < n; ++i) {
if (t < a[i]) {
cout << i + 1 << ' ' << t;
break;
}
t -= a[i];
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, k, d;
cin >> n >> k >> d;
vector<int> a(n);
// dp[個数][余り] (不可能な場合は -1)
vector<vector<ll>> dp(n + 1, vector<ll>(d, -1));
for (int i = 0; i < n; ++i) cin >> a[i];
// 個数 0 は 余り 0 で最大値 0
dp[0][0] = 0;
for (int i = 0; i < n; ++i) {
// ※ 個数の小さい順に更新すると、更新後の値でさらに更新してしまう
for (int cnt = i + 1; cnt > 0; --cnt) {
for (int rem = 0; rem < d; ++rem) {
// 遷移前の状態が到達不可能な状態なら continue
if (dp[cnt - 1][rem] == -1) continue;
// a_i を S に入れた場合に今までの最大値を上回るなら更新
dp[cnt][(rem + a[i]) % d] = max(dp[cnt][(rem + a[i]) % d], dp[cnt - 1][rem] + a[i]);
}
}
}
// 個数 k 余り 0 の最大値が答え。
cout << dp[k][0];
return 0;
}
multiset
や、組 を要素とした set
などを用いて 。操作回数が なので、オーダーは 。#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n);
// i = 0 (問題文では 1-indexed なので 1) のときの解を求める用
vector<int> first(m);
// 解説の AMins と AOthers
multiset<int> aMins, aOthers;
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < m; ++i) first[i] = a[i];
sort(first.begin(), first.end());
ll ans = 0;
// i = 0 の解を求め、AMins と AOthers に要素を格納
for (int i = 0; i < k; ++i) {
aMins.insert(first[i]);
ans += first[i];
}
for (int i = k; i < m; ++i) {
aOthers.insert(first[i]);
}
// i = 0 のときの解
cout << ans << ' ';
// i = 1, …, N - M までの解を求める
for (int i = m; i < n; ++i) {
// aMins に a[i - m] があるか探す
auto itrOut = aMins.find(a[i - m]);
// aMins に a[i - m] があるなら
if (itrOut != aMins.end()) {
aMins.erase(itrOut); // aMins から a[i - m] を削除
ans -= a[i - m]; // 答えから引く
aOthers.insert(a[i]); // aOthers には a[i] を入れる
int mov = *aOthers.begin(); // aOther の最小値
auto itrIn = aOthers.find(mov); // 削除用
// aOther の最小値を aMins に移動
aOthers.erase(itrIn); // ※ aOthers.erase(mov);
// だと複数の要素が削除される場合がある
aMins.insert(mov);
ans += mov; // 答えに足す
} else {
itrOut = aOthers.find(a[i - m]); // 削除用
aOthers.erase(itrOut); // aOthers から a[i - m] を削除
aMins.insert(a[i]); // aMins には a[i] を入れる
ans += a[i]; // 答えに足す
int mov = *aMins.rbegin(); // aMins の最大値
auto itrIn = aMins.find(mov); // 削除用
// aMins の最大値を aOthers に移動
aMins.erase(itrIn); // ※ aMins.erase(mov);
// だと複数の要素が削除される場合がある
ans -= mov; // 答えから引く
aOthers.insert(mov);
}
cout << ans << ' ';
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
// a は要素の集合、2 の sft 乗の位について解く
int solve(vector<int> &a, int sft) {
if (sft < 0) return 0;
// a0 は 2 の sft 乗の位の値が 0 である要素の集合
// a1 は 2 の sft 乗の位の値が 1 である要素の集合
vector<int> a0, a1;
for (int val : a) {
if (val & (1 << sft))
a1.push_back(val);
else
a0.push_back(val);
}
if (a0.empty() || a1.empty()) { // すべての要素の 2 の sft 乗の位の値が同じなら
return solve(a, sft - 1); // ans_sft = ans_{sft - 1}
} else { // 両方あるなら
// ans_sft = (2 の sft 乗) | min(ans0_{i - 1}, ans1_{i - 1})
return (1 << sft) | min(solve(a0, sft - 1), solve(a1, sft - 1));
}
}
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
// a_i < (2 の 30 乗) なので、2 の 29 乗の位まで調べればいい
cout << solve(a, 29);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int N;
ll M;
cin >> N >> M;
// 2 の累乗の前計算
vector<ll> p2(N * N);
p2[0] = 1;
for (int i = 1; i < N * N; ++i) p2[i] = p2[i - 1] * 2 % M;
// 二項係数の前計算 (パスカルの三角形)
vector<vector<ll>> C(N, vector<ll>(N));
C[0][0] = 1;
for (int i = 0; i < N - 1; ++i) {
for (int j = 0; j <= i; ++j) {
(C[i + 1][j] += C[i][j]) %= M;
(C[i + 1][j + 1] += C[i][j]) %= M;
}
}
// ((2 の i 乗) - 1) の k 乗の前計算
vector<vector<ll>> connectMinus1(N, vector<ll>(N));
for (int i = 1; i < N; ++i) {
connectMinus1[i][1] = (p2[i] + M - 1) % M;
for (int j = 2; j < N; ++j) {
connectMinus1[i][j] = connectMinus1[i][j - 1] * connectMinus1[i][1] % M;
}
}
// dp[頂点 1 と非連結な頂点数 (頂点 N を除く)][距離が最大の頂点数]
vector<vector<ll>> dp(N, vector<ll>(N));
// dp の計算
dp[N - 2][1] = 1;
for (int n = N - 3; n >= 0; --n) {
for (int k = 1; k <= N - 1 - n; ++k) {
for (int i = 1; i <= N - 1 - (n + k); ++i) {
dp[n][k] += dp[n + k][i] * C[n + k][k] % M *
connectMinus1[i][k] % M * p2[k * (k - 1) / 2] % M;
dp[n][k] %= M;
}
}
}
ll ans = 0;
// 答えの計算
for (int i = 1; i <= N - 2; ++i) {
(ans += dp[0][i] * connectMinus1[i][1]) %= M;
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using mint = modint998244353;
// 分割統治法で畳み込み
// g[i] は g(x) の x の (l + i) 乗の係数
vector<mint> dc(int l, int r, vector<mint> g) {
// 範囲の大きさが 1 なら (1 + a_l x) を返す
if (r - l == 1) return {1, g[0]};
int m = (l + r) / 2;
// 分割 左側 (g(x) の次数 [l, m) の範囲だけ渡す)
vector<mint> retLeft = dc(l, m, vector<mint>(&g[0], &g[m - l]));
// 分割 右側用の g を求める
// {f(x) * (1 + a_2) * … * (1 + a_{l - 1})} * {(1 + a_l) * … * (1 + a_{m - 1})}
vector<mint> gRight = convolution(g, retLeft);
// 分割 右側 (g(x) の次数 [m, r) の範囲だけ渡す)
vector<mint> retRight = dc(m, r, vector<mint>(&gRight[m - l], &gRight[r - l]));
// 左側の返り値と右側の返り値を掛けたものを返す
return convolution(retLeft, retRight);
}
int main() {
int n, a;
cin >> n >> a;
// 二項係数 a C i の計算
vector<mint> aC(n + 1);
aC[0] = 1;
for (int i = 1; i <= n; ++i) aC[i] = aC[i - 1] * (a + 1 - i) / i;
if (n <= 2) { // n <= 2 なら、解は a C n
cout << aC[n].val();
} else { // そうでないなら分割統治法
// l - 1 < 2 のとき g(x) = f(x)
// f(x) * {(1 + a_2) * … * (1 + a_{n - 1})} の x の n 乗の係数が解
cout << convolution(aC, dc(2, n, vector<mint>(&aC[2], &aC[n])))[n].val();
}
return 0;
}