#
を数えるだけ。 重ループとか。#include <bits/stdc++.h>
using namespace std;
int main() {
int h, w;
int ans = 0;
cin >> h >> w;
string s;
for (int i = 0; i < h; ++i) {
cin >> s;
for (int j = 0; j < w; ++j) {
if (s[j] == '#') ++ans;
}
}
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> s(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> s[i];
cout << s[i] - s[i - 1] << ' ';
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
string s, t;
cin >> s >> t;
s.push_back(' '); // s の末尾に絶対一致しない文字を追加
for (int i = 0, len = s.length(); i < len; ++i) {
if (s[i] != t[i]) {
cout << i + 1;
return 0;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll k;
ll ans = 1;
cin >> k;
int sqrtK = sqrt(k); // √K
for (int i = 2; i <= sqrtK; ++i) {
// i が k の素因数でないなら continue
if (k % i) continue;
// ※ i が合成数なら k % i != 0
// なぜならその前に割り切れなくなるまで
// i の素因数で k を割っているから
int index = 0; // k が持つ素因数 i の数 (指数)
while (k % i == 0) { // 割り切れなくなるまで
++index; // 数を加算
k /= i; // k を i で割る
}
// j! が i の index 乗の倍数となるような最小の j の計算
int j, multiple;
for (j = i;; j += i) { // i の倍数を小さい順に調べる
multiple = j;
while (multiple % i == 0) {
--index;
multiple /= i;
}
// j! が i の index 乗の倍数になったら終了
if (index <= 0) break;
}
ans = max(ans, (ll)j);
}
// この段階で k = 1 または k は √K より大きい素数
ans = max(ans, k);
cout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// 法 mod での累乗
long long pow(long long n, long long m, long long mod) {
long long ans = 1;
while (m) {
if (m & 1) ans = ans * n % mod;
n = n * n % mod;
m >>= 1;
}
return ans;
}
int main() {
ll n, p;
const int mod = 998244353;
cin >> n >> p;
vector<ll> dp(n + 1);
vector<ll> prob(n + 1);
// 体力が 2 減る確率
ll critical = p * pow(100, mod - 2, mod) % mod;
// 体力が 1 減る確率
ll notCritical = 1 + mod - critical;
// 式のとおり
dp[n] = 0;
prob[n] = 1;
for (int i = n; i >= 1; --i) {
(prob[i - 1] += prob[i] * notCritical) %= mod;
(prob[max(0, i - 2)] += prob[i] * critical) %= mod;
(dp[i - 1] += (dp[i] + prob[i]) * notCritical) %= mod;
(dp[max(0, i - 2)] += (dp[i] + prob[i]) * critical) %= mod;
}
cout << dp[0];
return 0;
}
nan
inf
inf
なので BFS や DFS で問題ない。#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, m, q;
cin >> n >> m >> q;
// コストありグラフ
vector<vector<pair<int, ll>>> g(n);
// group の値が同じなら連結 (Union-Find とかを使うのもあり)
vector<int> group(n);
const ll notVisited = 1ll << 60;
// ポイント (頂点 i に訪れていないなら notVisited)
vector<ll> d(n, notVisited);
// グラフ生成
for (ll i = 0, u, v, c; i < m; ++i) {
cin >> u >> v >> c;
--u; --v; // 0-indexed
g[u].emplace_back(v, c);
g[v].emplace_back(u, -c);
}
// 連結グラフの数
int cnt = 0;
// 連結グラフ i に正閉路があるか
vector<bool> isInf;
// 連結グラフごとに BFS
for (int i = 0; i < n; ++i) {
// 訪れている (別の連結グラフの頂点) なら continue
if (d[i] != notVisited) continue;
// 連結グラフ cnt (cnt はグラフ番号) について調べる
// BFS (i からのポイントを求める)
queue<int> que;
que.push(i);
d[i] = 0; // i から i のポイントは 0
// i は連結グラフ cnt の頂点
group[i] = cnt;
// 連結グラフ cnt に正閉路があるかを false で初期化
isInf.push_back(false);
while (!que.empty()) {
int v = que.front();
que.pop();
for (auto [to, cost] : g[v]) {
if (d[to] == notVisited) { // 訪れていないなら
group[to] = cnt; // to は連結グラフ cnt の頂点
d[to] = d[v] + cost;
que.push(to);
} else if (d[to] != d[v] + cost) { // ポイントの総和が違うパスがあるなら
isInf[cnt] = true; // 連結グラフ cnt には正閉路あり
}
}
}
++cnt; // グラフの数 (グラフの番号) を加算
}
// クエリへの回答
for (int i = 0, x, y; i < q; ++i) {
cin >> x >> y;
--x; --y; // 0-indexed
if (group[x] != group[y]) { // 違う連結グラフなら (連結でないなら)
cout << "nan\n";
} else if (isInf[group[x]]) { // 正閉路があるなら
cout << "inf\n";
} else { // 連結で正閉路がないなら
cout << d[y] - d[x] << '\n';
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// 正方形区間は [minX, minX + d] x [minY, minY + d] に固定して z はずらす
int cal(ll minX, ll minY, map<ll, vector<array<ll, 2>>> &p_zAll, ll d, vector<ll> &p2, const int mod) {
ll maxX = minX + d, maxY = minY + d;
ll ans = 0;
// 「x = minX か」「y = minY か」「z = minZ か」の 8 通りに分けた
// 立方体区間内のマスの数
vector<int> cnt(8);
// 添え字の 2 の 0 乗ビットは 「x = minX か」
// 2 の 1 乗ビットは 「y = minY か」
// 2 の 2 乗ビットは 「z = minZ か」
// minZ + d まで走査するイテレータ
auto itrZ = p_zAll.begin();
// minZ をずらしながら
for (auto itrMinZ = p_zAll.begin(); itrMinZ != p_zAll.end(); ++itrMinZ) {
ll minZ = itrMinZ->first;
ll maxZ = minZ + d;
// [minX, minX + d] x [minY, minY + d] x [minZ, minZ + d] のマスをカウント
for (; itrZ != p_zAll.end(); ++itrZ) {
ll z = itrZ->first;
if (z > maxZ) break; // minZ + d まで
// [minX, minX + d] x [minY, minY + d] のマスをカウント
for (auto [x, y] : itrZ->second) {
if (minX <= x && x <= maxX && minY <= y && y <= maxY) {
// z == minZ の場合もとりあえず z != minZ のところでカウント
++cnt[(x == minX) | (y == minY) << 1];
}
}
}
// z == minZ のパターンは初期化
for (int i = 4; i < 8; ++i) cnt[i] = 0;
// z == minZ である [minX, minX + d] x [minY, minY + d] のマスをカウント
for (auto [x, y] : itrMinZ->second) {
if (minX <= x && x <= maxX && minY <= y && y <= maxY) {
int flag = (x == minX) | (y == minY) << 1;
// z != minZ でカウントしてたので入れ替え
--cnt[flag];
++cnt[flag | 4];
}
}
// x == minX, y == minY, z == minZ が true のマスがそれぞれ 1 つ以上必要
// 7 があるなら、それ以外は自由
ans += (p2[cnt[7]] - 1) * p2[cnt[0] + cnt[1] + cnt[2] + cnt[3] + cnt[4] + cnt[5] + cnt[6]] % mod;
// 7 がなくて 6 があるなら x == minX が true の満たすマスが必要
ans += (p2[cnt[6]] - 1) * (p2[cnt[1] + cnt[3] + cnt[5]] - 1) % mod * p2[cnt[0] + cnt[2] + cnt[4]] % mod;
// 7, 6 がなくて 5 があるなら y == minY が true のマスが必要
ans += (p2[cnt[5]] - 1) * (p2[cnt[2] + cnt[3]] - 1) % mod * p2[cnt[0] + cnt[1] + cnt[4]] % mod;
// 7, 6, 5 がなくて 3 があるなら z == minZ が true のマスが必要
ans += (p2[cnt[3]] - 1) * (p2[cnt[4]] - 1) % mod * p2[cnt[0] + cnt[1] + cnt[2]] % mod;
// 7, 6, 5, 3 がないなら 1, 2, 4 全部必要
ans += (p2[cnt[4]] - 1) * (p2[cnt[2]] - 1) % mod * (p2[cnt[1]] - 1) % mod * p2[cnt[0]] % mod;
ans %= mod;
}
return ans;
}
int main() {
int n;
ll d;
const int mod = 998244353;
int ans = 0;
cin >> n >> d;
// (2 の n 乗) % mod の計算
vector<ll> p2(n + 1);
p2[0] = 1;
for (int i = 1; i <= n; ++i) p2[i] = p2[i - 1] * 2 % mod;
// 座標変換 (X, Y) -> (x, y, z) ((x, y, z) = (X, Y, X - Y))
// z ごとに座標変換後のマスの値 ({x, y}) を格納
map<ll, vector<array<ll, 2>>> p_zAll;
// 座標変換後のマスの x, y の値を格納
set<ll> xAll, yAll;
for (int i = 0, X, Y, z; i < n; ++i) {
cin >> X >> Y;
z = X - Y;
p_zAll[z].push_back({X, Y});
xAll.insert(X);
yAll.insert(Y);
}
// すべての組 (x, y) に対して z をずらしながら
// 立方体区間 [x, x + d] x [y, y + d] x [z, z + d] を走査
for (ll x : xAll) {
for (ll y : yAll) {
(ans += cal(x, y, p_zAll, d, p2, mod)) %= mod;
}
}
cout << ans;
}