QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#113213 | #1944. Circle of Friends | rgnerdplayer# | AC ✓ | 790ms | 39920kb | C++20 | 5.1kb | 2023-06-16 17:50:00 | 2023-06-16 17:50:04 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
template <int MOD, int ROOT = 3>
struct Modint {
static constexpr int P = MOD;
static constexpr int RT = ROOT;
private:
int v;
static int minv(int a, int m) {
a %= m;
assert(a);
return a == 1 ? 1 : m - 1LL * minv(m, a) * m / a;
}
public:
Modint() : v(0) {}
Modint(i64 v_) : v(v_ % P) {
if (v < 0) v += P;
}
explicit operator int() const { return v; }
friend ostream& operator<<(ostream &out, const Modint &n) {
return out << int(n);
}
friend istream& operator>>(istream &in, Modint &n) {
i64 v;
in >> v;
n = Modint(v);
return in;
}
friend string to_string(Modint a) {
return to_string(int(a));
}
friend bool operator==(const Modint &a, const Modint &b) {
return a.v == b.v;
}
friend bool operator!=(const Modint &a, const Modint &b) {
return a.v != b.v;
}
Modint inv() const {
Modint res;
res.v = minv(v, P);
return res;
}
Modint operator-() const {
Modint res;
res.v = v ? P - v : 0;
return res;
}
Modint& operator++() {
v++;
if (v == P) v = 0;
return *this;
}
Modint& operator--() {
if (v == 0) v = P;
v--;
return *this;
}
Modint& operator+=(const Modint &o) {
v -= P - o.v;
v = (v < 0) ? v + P : v;
return *this;
}
Modint& operator-=(const Modint &o) {
v -= o.v;
v = (v < 0) ? v + P : v;
return *this;
}
Modint& operator*=(const Modint &o) {
v = 1LL * v * o.v % P;
return *this;
}
Modint& operator/=(const Modint &o) { return *this *= o.inv(); }
friend Modint operator++(Modint &a, int) {
Modint r = a;
++a;
return r;
}
friend Modint operator--(Modint &a, int) {
Modint r = a;
--a;
return r;
}
friend Modint operator+(const Modint &a, const Modint &b) {
return Modint(a) += b;
}
friend Modint operator-(const Modint &a, const Modint &b) {
return Modint(a) -= b;
}
friend Modint operator*(const Modint &a, const Modint &b) {
return Modint(a) *= b;
}
friend Modint operator/(const Modint &a, const Modint &b) {
return Modint(a) /= b;
}
Modint qpow(i64 p) {
Modint res = 1, x = v;
while (p > 0) {
if (p & 1) res *= x;
x *= x;
p >>= 1;
}
return res;
}
};
constexpr int P = 998244353;
using Mint = Modint<P>;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
auto solve = [&]() {
int n;
cin >> n;
vector<i64> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
{
i64 all = -1;
for (int i = 0; i < n; i++) {
all &= a[i];
}
if (all != 0) {
cout << Mint(2).qpow(n) - n << '\n';
return;
}
}
Mint ans = 0;
auto work = [&](vector<i64> a) {
int n = a.size();
int lg = __lg(n) + 1;
vector f(lg + 1, vector<i64>(n));
f[0] = a;
for (int i = 1; i <= lg; i++) {
for (int j = 0; j + (1 << i) <= n; j++) {
f[i][j] = f[i - 1][j] & f[i - 1][j + (1 << i - 1)];
}
}
vector<Mint> dp(n + 1), suf(n + 2);
dp[n] = suf[n] = 1;
for (int i = n - 1; i >= 0; i--) {
int j = i;
i64 cur = -1;
for (int b = lg; b >= 0; b--) {
if (j + (1 << b) <= n && (cur & f[b][j]) != 0) {
cur &= f[b][j];
j += 1 << b;
}
}
dp[i] = suf[i + 1] - suf[j + 1];
suf[i] = suf[i + 1] + dp[i];
}
// for (int i = 0; i < n; i++) {
// cout << a[i] << " \n"[i == n - 1];
// }
// for (int i = 0; i < n; i++) {
// cout << dp[i] << " \n"[i == n - 1];
// }
ans += dp[0];
int p = 0;
i64 cur = a.back();
while (true) {
i64 prv = cur;
cur &= a[p];
if (cur != prv) {
break;
}
ans += dp[++p];
}
a.back() = cur;
return vector<i64>(a.begin() + p + 1, a.end());
};
while (!count(a.begin(), a.end(), 0)) {
auto b = work(a);
swap(a, b);
}
cout << ans << '\n';
};
solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3464kb
input:
1 1
output:
1
result:
ok single line: '1'
Test #2:
score: 0
Accepted
time: 1ms
memory: 3456kb
input:
1 1152921504606846975
output:
1
result:
ok single line: '1'
Test #3:
score: 0
Accepted
time: 7ms
memory: 4604kb
input:
200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...
output:
792053081
result:
ok single line: '792053081'
Test #4:
score: 0
Accepted
time: 22ms
memory: 4620kb
input:
200000 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606...
output:
792053081
result:
ok single line: '792053081'
Test #5:
score: 0
Accepted
time: 31ms
memory: 39860kb
input:
200000 18031990763159554 108095195748368386 36029346783428610 184085739649376272 577639437895209218 72057594042191904 4508276314083330 9078671805521920 144255925580990466 432490704060547904 72059793094738017 562967269607456 26424786302976 68719476738 333275855713337352 11370333479109156 290271086772...
output:
697849429
result:
ok single line: '697849429'
Test #6:
score: 0
Accepted
time: 51ms
memory: 39852kb
input:
200000 38878877261704467 606583538776039621 325557318447172624 513696235393139082 288309595180245073 22000404187620950 28465258695911754 432534927738538528 217932069505099992 8444275091048961 378456596858036610 909745820721741897 10707049231951490 869769773255361289 1054197601224687632 2974146034978...
output:
472024961
result:
ok single line: '472024961'
Test #7:
score: 0
Accepted
time: 90ms
memory: 39848kb
input:
200000 231835759121035702 510237390901680560 1089228954142887951 546561500990948259 452812301317437416 674492659073810407 610376405449845423 336095507987037999 1104321677521773827 257064906190991194 551711390461204674 320506912224540602 57990152440076744 845010071877357771 403229887439671683 2693178...
output:
117345155
result:
ok single line: '117345155'
Test #8:
score: 0
Accepted
time: 149ms
memory: 39888kb
input:
200000 1041523633558056719 1133745259996491747 395753651864850428 1151926721450571413 1114422491360386046 1152921229520204786 1116662492370558395 1006273041715269578 86101463265049534 359143197109542363 242065648916576479 903956062749589338 1091893347132366767 670735077154993663 1142330444352434159 ...
output:
648136624
result:
ok single line: '648136624'
Test #9:
score: 0
Accepted
time: 279ms
memory: 39776kb
input:
200000 1148136361283288575 864128178497519103 504403123704430591 1080722898202656703 1150660907089100671 1148417885111055871 1133781167519004367 1152921229712162815 1152902245931548635 1152846703454314239 1152358485925492735 1134766329820016511 1080863910560530363 1071715973758713727 468354552857362...
output:
21378100
result:
ok single line: '21378100'
Test #10:
score: 0
Accepted
time: 708ms
memory: 39920kb
input:
200000 576460752303419383 1150669704793159679 1152921504606846847 1152921504598458367 1143914030474199039 1152921504606846975 1152921504606846967 1152921504590069759 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152640029630136319 11529215046068...
output:
557285638
result:
ok single line: '557285638'
Test #11:
score: 0
Accepted
time: 726ms
memory: 39836kb
input:
200000 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606...
output:
438039103
result:
ok single line: '438039103'
Test #12:
score: 0
Accepted
time: 790ms
memory: 39920kb
input:
200000 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606...
output:
440098984
result:
ok single line: '440098984'
Test #13:
score: 0
Accepted
time: 450ms
memory: 39580kb
input:
200000 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606846975 1152921504606...
output:
413438309
result:
ok single line: '413438309'