結果
| 問題 |
No.3070 Collecting Coins Speedrun 2
|
| コンテスト | |
| ユーザー |
tobbie
|
| 提出日時 | 2025-04-09 22:16:32 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 44 ms / 2,000 ms |
| コード長 | 1,281 bytes |
| コンパイル時間 | 2,259 ms |
| コンパイル使用メモリ | 195,580 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-04-09 22:16:36 |
| 合計ジャッジ時間 | 4,252 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define rep(i, n) for (int i = 0; i < (int)n; i++)
int mod_inv(int i, int mod) {
int x = i;
int y = mod, u = 1, v = 0;
while (y) {
int t = x / y;
x -= t * y; swap(x, y);
u -= t * v; swap(u, v);
}
return (u + mod) % mod;
}
int mod_div(int x, int y, int mod) {
return ((ll)x * mod_inv(y, mod)) % mod;
}
int mod_pow(int i, int y, int mod) {
int x = i;
int ret = 1;
while (y > 0) {
if ((y & 0x01) != 0)
ret = (long long)ret * x % mod;
x = (long long)x * x % mod;
y >>= 1;
}
return ret;
}
int main() {
const int mod = 998244353;
int n; cin >> n;
vector<int> cm, cp;
int czn = 0;
rep(i, n) {
int c; cin >> c;
if (c < 0) cm.push_back(-c);
else if (c > 0) cp.push_back(c);
else czn++;
}
int cmn = (int)cm.size();
int cpn = (int)cp.size();
int a = 1, b = 1;
if (cmn > 0)
a = mod_pow(2, cmn - 1, mod);
if (cpn > 0)
b = mod_pow(2, cpn - 1, mod);
int ans = ((ll)a * (ll)b) % mod;
if (cmn > 0 && cpn > 0)
ans = ((ll)ans * 2) % mod;
if (czn > 0) {
if (cmn > 0 && cpn > 0)
ans = ((ll)ans * 3) % mod;
else if (cmn > 0 || cpn > 0)
ans = ((ll)ans * 2) % mod;
}
cout << ans << endl;
}
tobbie