for
使えれば解ける。#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> s(n);
for (int i = 0; i < n; ++i) cin >> s[i];
for (int i = n - 1; i >= 0; --i) cout << s[i] << '\n';
return 0;
}
x
が奇数かどうかは x % 2 == 1
かどうかと等しい。#include <bits/stdc++.h>
using namespace std;
int main() {
int t, n, a;
cin >> t;
for (int i = 0; i < t; ++i) { // T 個のテストケースについて
int ans = 0;
cin >> n;
for (int j = 0; j < n; ++j) {
cin >> a;
// 奇数なら答えに 1 加算 (if (a % 2) とか if (a & 1) とかでもできる)
if (a % 2 == 1) ++ans;
}
cout << ans << '\n';
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> g(n);
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
--u; --v;
g[u].push_back(v);
g[v].push_back(u);
}
int ans = 0;
// 各頂点ごとに BFS
vector<bool> visited(n); // 探索済みなら true
for (int i = 0; i < n; ++i) {
if (visited[i]) continue; // 探索済みなら continue
++ans; // 探索済みでないなら答えに 1 加算して BFS
queue<int> que;
que.push(i);
visited[i] = 0;
while (!que.empty()) {
int v = que.front();
que.pop();
for (int child : g[v]) {
if (!visited[child]) {
visited[child] = true;
que.push(child);
}
}
}
}
cout << ans;
return 0;
}
sqrt
関数は double
を扱うから long long
を入れると誤差が出るので、long double
を扱う sqrtl
関数を使うほうが無難。(今回は誤差が出ても、整数に直す際の四捨五入で帳尻が合うっぽい。)#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int t;
ll p, q;
ll n;
cin >> t;
for (int i = 0; i < t; ++i) {
cin >> n;
for (ll r = 2; r <= 3000000; ++r) {
if (!(n % r)) { // n の約数なら
if (n % (r * r)) { // r の 2 乗の約数なら
p = sqrtl(n / r);
q = r;
} else { // r の 2 乗の約数でないなら
p = r;
q = n / (r * r);
}
cout << p << ' ' << q << '\n';
break;
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int dfs(int v, vector<vector<int>>& g, vector<bool>& visited) {
static int ans = 0;
if (ans == 1000000) return 1000000; // 1000000 になったら強制終了
++ans;
visited[v] = true; // 通ったことを記録する
for (int a : g[v]) {
if (!visited[a]) { // 通ってないところを探索
dfs(a, g, visited);
}
}
visited[v] = false; // 戻るときに記録を消す
return ans;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> g(n);
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
--u; --v;
g[u].push_back(v);
g[v].push_back(u);
}
vector<bool> visited(n);
cout << dfs(0, g, visited);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
// rolling hash
template <typename T = char>
class RollingHash {
const unsigned long long base;
const unsigned long long mask31 = (1ull << 31) - 1;
const unsigned long long mask30 = (1ull << 30) - 1;
const unsigned long long mod = (1ull << 61) - 1;
const unsigned long long mask61 = mod;
const size_t n;
vector<unsigned long long> hash;
vector<unsigned long long> basePow;
unsigned long long mul(unsigned long long a, unsigned long long b) {
unsigned long long ah = a >> 31, al = a & mask31;
unsigned long long bh = b >> 31, bl = b & mask31;
unsigned long long m = ah * bl + al * bh;
unsigned long long mh = m >> 30, ml = m & mask30;
return ah * bh * 2 + mh + (ml << 31) + al * bl;
}
unsigned long long calcMod(unsigned long long a) {
unsigned long long ah = a >> 61, al = a & mask61;
unsigned long long ret = ah + al;
if (ret >= mod) ret -= mod;
return ret;
}
public:
RollingHash(const vector<T>& s, unsigned long long _base = 1000000009)
: base(_base), n(s.size()), hash(n + 1), basePow(n + 1) {
basePow[0] = 1;
for (size_t i = 0; i < n; ++i) {
hash[i + 1] = calcMod(mul(hash[i], base) + s[i]);
basePow[i + 1] = calcMod(mul(basePow[i], base));
}
}
RollingHash(const string& s, unsigned long long _base = 263)
: RollingHash(vector<char>(s.begin(), s.end()), _base) {}
unsigned long long getHash(int x) { return hash[x]; }
// [L, R) の hash 値を返す
unsigned long long getHash(int L, int R) {
return calcMod(hash[R] + mod * 4 - mul(hash[L], basePow[R - L]));
}
};
int main() {
int n;
string t;
cin >> n >> t;
string rt(t.rbegin(), t.rend()); // T を反転した文字列
RollingHash ht(t), hrt(rt); // rolling hash
for (int i = 0; i < n; ++i) {
if (ht.getHash(0, i) == hrt.getHash(n - i, n) &&
ht.getHash(n + i, n * 2) == hrt.getHash(n, n * 2 - i)) {
cout << rt.substr(n - i, n) << '\n' << i;
return 0;
}
}
cout << -1;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, m;
ll ans = 0;
cin >> n >> m;
vector<ll> P(n); // {n - 1}_P_i
vector<ll> powN(n); // n の i 乗
P[0] = 1; powN[0] = 1;
for (int i = 1; i < n; ++i) P[i] = P[i - 1] * (n - i) % m;
for (int i = 1; i < n; ++i) powN[i] = powN[i - 1] * n % m;
// S_1 だけ計算する
for (int i = 1; i <= n; ++i) {
ans += P[i - 1] * powN[n - i] % m * ((ll)i * (i - 1) / 2 % m) % m;
ans %= m;
}
cout << ans * n % m; // 最後に n 倍する
return 0;
}
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using mint = modint;
class Factorial {
int n;
vector<mint> fac;
vector<mint> inv;
public:
Factorial(int _n) : n(max(0, _n)), fac(n + 1), inv(n + 1) {
fac[0] = 1; inv[0] = 1;
for (int i = 1; i <= n; ++i) fac[i] = fac[i - 1] * i;
inv[n] = fac[n].inv();
for (int i = n; i > 1; --i) inv[i - 1] = inv[i] * i;
}
mint getFac(int n) { return fac[n]; }
mint C(int n, int r) {
if (n < 0 || r < 0 || n < r) return 0;
return fac[n] * inv[r] * inv[n - r];
}
};
// k 色以下の polya の数え上げ
mint cal(int n, int k) {
vector<pair<int, int>> v;
mint ans = 0;
Factorial F(n);
// 分割用
auto dfs = [&](auto self, int n, int last) -> void {
if (n == 0) {
mint cur = 1; // 最後に N! で割る代わりに、置換の通り数の N! を掛けない
for (int i = 0, sz = v.size(); i < sz; ++i) {
auto [ci, si] = v[i];
// ci の si 個分と si! で割る
cur /= F.getFac(si) * ((mint)ci).pow(si);
// k の si 乗を掛ける ((k の m 乗) = (k の sum(si) 乗))
cur *= ((mint)k).pow(si);
// 2 の floor(ci / 2) 乗を si 個掛ける
cur *= ((mint)2).pow(ci / 2 * si);
// 2 の gcd(ci, ci) 乗を si * (si - 1) / 2 個掛ける
cur *= ((mint)2).pow(ci * si * (si - 1) / 2);
// 2 の gcd(ci, cj) 乗を si * sj 個掛ける
for (int j = 0; j < i; ++j) {
auto [cj, sj] = v[j];
cur *= ((mint)2).pow(gcd(ci, cj) * si * sj);
}
}
ans += cur;
return;
}
for (int i = last + 1; i <= n; ++i) {
for (int j = 1; i * j <= n; ++j) {
v.emplace_back(i, j);
self(self, n - i * j, i);
v.pop_back();
}
}
};
dfs(dfs, n, 0);
return ans;
}
int main() {
int n, k, p;
mint ans = 0;
cin >> n >> k >> p;
mint::set_mod(p);
Factorial F(n);
// 包除原理
for (int i = 1; i <= k; ++i) {
ans += ((k ^ i) & 1 ? -1 : 1) * F.C(k, i) * cal(n, i);
}
cout << ans.val();
return 0;
}