QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#322661 | #8209. Curly Palindromes | triple__a# | AC ✓ | 2ms | 9736kb | C++20 | 10.1kb | 2024-02-07 14:16:46 | 2024-02-07 14:16:47 |
Judging History
answer
// #pragma GCC optimize("trapv")
#include<bits/stdc++.h>
#define int long long
#define i128 __int128_t
using namespace std;
constexpr int P = 998244353;
// constexpr int P = 1e9+7;
using i64 = long long;
// assume -P <= x < 2P
int norm(int x) {
if (x < 0) {
x += P;
}
if (x >= P) {
x -= P;
}
return x;
}
template<class T>
T power(T a, i64 b) {
T res = 1;
for (; b; b /= 2, a *= a) {
if (b % 2) {
res *= a;
}
}
return res;
}
struct Z {
int x;
Z(int x = 0) : x(norm(x%P)) {}
int val() const {
return x;
}
Z operator-() const {
return Z(norm(P - x));
}
Z inv() const {
assert(x != 0);
return power(*this, P - 2);
}
Z &operator*=(const Z &rhs) {
x = i64(x) * rhs.x % P;
return *this;
}
Z &operator+=(const Z &rhs) {
x = norm(x + rhs.x);
return *this;
}
Z &operator-=(const Z &rhs) {
x = norm(x - rhs.x);
return *this;
}
Z &operator/=(const Z &rhs) {
return *this *= rhs.inv();
}
friend Z operator*(const Z &lhs, const Z &rhs) {
Z res = lhs;
res *= rhs;
return res;
}
friend Z operator+(const Z &lhs, const Z &rhs) {
Z res = lhs;
res += rhs;
return res;
}
friend Z operator-(const Z &lhs, const Z &rhs) {
Z res = lhs;
res -= rhs;
return res;
}
friend Z operator/(const Z &lhs, const Z &rhs) {
Z res = lhs;
res /= rhs;
return res;
}
friend std::istream &operator>>(std::istream &is, Z &a) {
i64 v;
is >> v;
a = Z(v);
return is;
}
friend std::ostream &operator<<(std::ostream &os, const Z &a) {
return os << a.val();
}
};
std::vector<int> rev;
std::vector<Z> roots{0, 1};
void dft(std::vector<Z> &a) {
int n = a.size();
if ((int)(rev.size()) != n) {
int k = __builtin_ctz(n) - 1;
rev.resize(n);
for (int i = 0; i < n; i++) {
rev[i] = rev[i >> 1] >> 1 | (i & 1) << k;
}
}
for (int i = 0; i < n; i++) {
if (rev[i] < i) {
std::swap(a[i], a[rev[i]]);
}
}
if ((int)(roots.size()) < n) {
int k = __builtin_ctz(roots.size());
roots.resize(n);
while ((1 << k) < n) {
Z e = power(Z(3), (P - 1) >> (k + 1));
for (int i = 1 << (k - 1); i < (1 << k); i++) {
roots[2 * i] = roots[i];
roots[2 * i + 1] = roots[i] * e;
}
k++;
}
}
for (int k = 1; k < n; k *= 2) {
for (int i = 0; i < n; i += 2 * k) {
for (int j = 0; j < k; j++) {
Z u = a[i + j];
Z v = a[i + j + k] * roots[k + j];
a[i + j] = u + v;
a[i + j + k] = u - v;
}
}
}
}
void idft(std::vector<Z> &a) {
int n = a.size();
std::reverse(a.begin() + 1, a.end());
dft(a);
Z inv = (1 - P) / n;
for (int i = 0; i < n; i++) {
a[i] *= inv;
}
}
struct Poly {
std::vector<Z> a;
Poly() {}
explicit Poly(int size, std::function<Z(int)> f = [](int) { return 0; }) : a(size) {
for (int i = 0; i < size; i++) {
a[i] = f(i);
}
}
Poly(const std::vector<Z> &a) : a(a) {}
Poly(const std::initializer_list<Z> &a) : a(a) {}
int size() const {
return a.size();
}
void resize(int n) {
a.resize(n);
}
Z operator[](int idx) const {
if (idx < size()) {
return a[idx];
} else {
return 0;
}
}
Z &operator[](int idx) {
return a[idx];
}
Poly mulxk(int k) const {
auto b = a;
b.insert(b.begin(), k, 0);
return Poly(b);
}
Poly modxk(int k) const {
k = std::min(k, size());
return Poly(std::vector<Z>(a.begin(), a.begin() + k));
}
Poly divxk(int k) const {
if (size() <= k) {
return Poly();
}
return Poly(std::vector<Z>(a.begin() + k, a.end()));
}
friend Poly operator+(const Poly &a, const Poly &b) {
std::vector<Z> res(std::max(a.size(), b.size()));
for (int i = 0; i < (int)(res.size()); i++) {
res[i] = a[i] + b[i];
}
return Poly(res);
}
friend Poly operator-(const Poly &a, const Poly &b) {
std::vector<Z> res(std::max(a.size(), b.size()));
for (int i = 0; i < (int)(res.size()); i++) {
res[i] = a[i] - b[i];
}
return Poly(res);
}
friend Poly operator-(const Poly &a) {
std::vector<Z> res(a.size());
for (int i = 0; i < (int)(res.size()); i++) {
res[i] = -a[i];
}
return Poly(res);
}
friend Poly operator*(Poly a, Poly b) {
if (a.size() == 0 || b.size() == 0) {
return Poly();
}
if (a.size() < b.size()) {
std::swap(a, b);
}
if (b.size() < 128) {
Poly c(a.size() + b.size() - 1);
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < b.size(); j++) {
c[i + j] += a[i] * b[j];
}
}
return c;
}
int sz = 1, tot = a.size() + b.size() - 1;
while (sz < tot) {
sz *= 2;
}
a.a.resize(sz);
b.a.resize(sz);
dft(a.a);
dft(b.a);
for (int i = 0; i < sz; ++i) {
a.a[i] = a[i] * b[i];
}
idft(a.a);
a.resize(tot);
return a;
}
friend Poly operator*(Z a, Poly b) {
for (int i = 0; i < (int)(b.size()); i++) {
b[i] *= a;
}
return b;
}
friend Poly operator*(Poly a, Z b) {
for (int i = 0; i < (int)(a.size()); i++) {
a[i] *= b;
}
return a;
}
Poly &operator+=(Poly b) {
return (*this) = (*this) + b;
}
Poly &operator-=(Poly b) {
return (*this) = (*this) - b;
}
Poly &operator*=(Poly b) {
return (*this) = (*this) * b;
}
Poly deriv() const {
if (a.empty()) {
return Poly();
}
std::vector<Z> res(size() - 1);
for (int i = 0; i < size() - 1; ++i) {
res[i] = (i + 1) * a[i + 1];
}
return Poly(res);
}
Poly integr() const {
std::vector<Z> res(size() + 1);
for (int i = 0; i < size(); ++i) {
res[i + 1] = a[i] / (i + 1);
}
return Poly(res);
}
Poly inv(int m) const {
Poly x{a[0].inv()};
int k = 1;
while (k < m) {
k *= 2;
x = (x * (Poly{2} - modxk(k) * x)).modxk(k);
}
return x.modxk(m);
}
Poly log(int m) const {
return (deriv() * inv(m)).integr().modxk(m);
}
Poly exp(int m) const {
Poly x{1};
int k = 1;
while (k < m) {
k *= 2;
x = (x * (Poly{1} - x.log(k) + modxk(k))).modxk(k);
}
return x.modxk(m);
}
Poly pow(int k, int m) const {
int i = 0;
while (i < size() && a[i].val() == 0) {
i++;
}
if (i == size() || 1LL * i * k >= m) {
return Poly(std::vector<Z>(m));
}
Z v = a[i];
auto f = divxk(i) * v.inv();
return (f.log(m - i * k) * k).exp(m - i * k).mulxk(i * k) * power(v, k);
}
Poly sqrt(int m) const {
Poly x{1};
int k = 1;
while (k < m) {
k *= 2;
x = (x + (modxk(k) * x.inv(k)).modxk(k)) * ((P + 1) / 2);
}
return x.modxk(m);
}
Poly mulT(Poly b) const {
if (b.size() == 0) {
return Poly();
}
int n = b.size();
std::reverse(b.a.begin(), b.a.end());
return ((*this) * b).divxk(n - 1);
}
std::vector<Z> eval(std::vector<Z> x) const {
if (size() == 0) {
return std::vector<Z>(x.size(), 0);
}
const int n = std::max((int)(x.size()), size());
std::vector<Poly> q(4 * n);
std::vector<Z> ans(x.size());
x.resize(n);
std::function<void(int, int, int)> build = [&](int p, int l, int r) {
if (r - l == 1) {
q[p] = Poly{1, -x[l]};
} else {
int m = (l + r) / 2;
build(2 * p, l, m);
build(2 * p + 1, m, r);
q[p] = q[2 * p] * q[2 * p + 1];
}
};
build(1, 0, n);
std::function<void(int, int, int, const Poly &)> work = [&](int p, int l, int r, const Poly &num) {
if (r - l == 1) {
if (l < (int)(ans.size())) {
ans[l] = num[0];
}
} else {
int m = (l + r) / 2;
work(2 * p, l, m, num.mulT(q[2 * p + 1]).modxk(m - l));
work(2 * p + 1, m, r, num.mulT(q[2 * p]).modxk(r - m));
}
};
work(1, 0, n, mulT(q[1].inv(n)));
return ans;
}
};
const int N=500007;
const int INF=LLONG_MAX/4;
mt19937 rng(1234);
int n;
int cnt[N],x[N],y[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n;
for (int i=0;i<n;++i){
char c;
cin>>x[i]>>y[i]>>c;
cnt[c-'a']++;
}
bool ok=0;
for (int i=0;i<26;++i){
if (cnt[i]>1) ok=1;
}
if (!ok) {cout<<1; return 0;}
ok=0;
for (int i=0;i<n;++i){
for (int j=0;j<n;++j){
for (int k=0;k<n;++k){
int dx1=x[i]-x[j], dx2=x[i]-x[k];
int dy1=y[i]-y[j], dy2=y[i]-y[k];
if (dx1*dy2!=dy1*dx2) ok=1;
}
}
}
if (ok) cout<<"Infinity";
else cout<<2;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 7748kb
input:
4 0 0 o 1 1 c 2 2 p 3 3 c
output:
2
result:
ok single line: '2'
Test #2:
score: 0
Accepted
time: 1ms
memory: 7728kb
input:
3 2 3 e 3 2 e 8 9 e
output:
Infinity
result:
ok single line: 'Infinity'
Test #3:
score: 0
Accepted
time: 1ms
memory: 9736kb
input:
3 0 0 p 1 1 c 2 2 o
output:
1
result:
ok single line: '1'
Test #4:
score: 0
Accepted
time: 0ms
memory: 7744kb
input:
3 1000000000 1000000000 a 0 1000000000 b 1000000000 0 a
output:
Infinity
result:
ok single line: 'Infinity'
Test #5:
score: 0
Accepted
time: 1ms
memory: 7688kb
input:
5 10 0 a 20 0 b 30 0 c 41 0 d 42 0 e
output:
1
result:
ok single line: '1'
Test #6:
score: 0
Accepted
time: 1ms
memory: 7756kb
input:
6 999999999 1000000000 b 0 0 a 1 1 a 2 2 c 3 3 d 4 4 e
output:
Infinity
result:
ok single line: 'Infinity'
Test #7:
score: 0
Accepted
time: 0ms
memory: 7916kb
input:
1 52524 6287 o
output:
1
result:
ok single line: '1'
Test #8:
score: 0
Accepted
time: 2ms
memory: 7688kb
input:
100 620277501 352211578 a 588745387 204868067 a 279087773 862840409 a 368942847 32429835 a 986161321 811576403 a 108066135 22119129 a 854047430 512772131 a 196877261 824967276 a 467809712 903492464 a 549499819 662329823 a 358024530 364859507 a 323528347 87306983 a 346602511 829302399 a 216164493 243...
output:
Infinity
result:
ok single line: 'Infinity'
Test #9:
score: 0
Accepted
time: 2ms
memory: 7916kb
input:
100 964906060 545884156 b 525844995 678718384 a 767874103 529057847 b 335899480 961060244 b 458611128 578152716 b 449062933 779433747 a 672526007 895103745 b 111902255 436806217 a 873636242 773662394 a 250185459 522336127 a 975489206 77297854 b 54583166 952092302 a 863604349 909716224 a 70170689 533...
output:
Infinity
result:
ok single line: 'Infinity'
Test #10:
score: 0
Accepted
time: 0ms
memory: 7984kb
input:
100 197441358 388148939 b 374082779 922588431 b 545855650 531926491 b 953289473 249626190 a 997668672 445922624 b 941714598 963970889 a 252303702 946260915 c 705178416 744961339 a 889814639 633539049 b 526449032 53699804 b 937365752 742338401 b 294384909 349114633 b 245948038 979810742 c 46734037 30...
output:
Infinity
result:
ok single line: 'Infinity'
Test #11:
score: 0
Accepted
time: 2ms
memory: 7920kb
input:
100 388507460 599009943 b 222320564 871491185 b 323837196 829762427 d 202083245 906788357 c 200289725 313692532 c 65770043 517104251 d 905710326 292385376 b 3487284 126745388 b 495927620 829852193 b 97679895 880030775 b 677903935 407378948 d 534186652 672508037 b 964728216 976276332 b 391893605 5597...
output:
Infinity
result:
ok single line: 'Infinity'
Test #12:
score: 0
Accepted
time: 2ms
memory: 7788kb
input:
100 916010051 146307434 c 480623765 410328522 d 28189815 127598363 c 745844310 195354303 c 739347268 591527857 d 484792781 775270322 b 190520730 638509838 d 6828862 434900510 b 512106017 321132628 e 668910759 411394452 b 639780481 72419495 a 773988394 364497659 c 347071905 341338141 d 368456952 5180...
output:
Infinity
result:
ok single line: 'Infinity'
Test #13:
score: 0
Accepted
time: 2ms
memory: 7660kb
input:
100 86229674 966475154 g 188905509 869037044 j 206431319 885238671 g 384203494 608011484 b 94907195 845681979 j 93491181 751753218 f 658592436 874867662 j 390873056 182636414 b 313350178 5306341 j 964520327 884419573 c 616180319 281427186 e 506244230 796896398 b 427455351 844237339 f 78090262 517379...
output:
Infinity
result:
ok single line: 'Infinity'
Test #14:
score: 0
Accepted
time: 2ms
memory: 7728kb
input:
100 215977786 124594064 t 330805101 191632694 a 89113834 355297431 h 763543468 766857893 i 129574380 326152621 t 980011509 580824171 l 593104211 610936942 p 433305160 169599834 n 169733556 636573400 d 529043807 454466372 h 898931244 35490902 l 277816100 810116698 c 35985918 405195648 i 188992394 893...
output:
Infinity
result:
ok single line: 'Infinity'
Test #15:
score: 0
Accepted
time: 2ms
memory: 7692kb
input:
100 708120351 620407913 n 535329934 654852971 t 609745260 478749536 q 362094763 276915210 s 280981242 647870195 n 936373080 162431905 h 260497437 466345348 o 181689176 124319222 n 488142303 321448453 b 39367382 527550314 k 301142721 730766894 n 126691970 634927413 k 412986447 268439483 x 227790067 4...
output:
Infinity
result:
ok single line: 'Infinity'
Test #16:
score: 0
Accepted
time: 0ms
memory: 7636kb
input:
26 526735598 478961006 a 531191531 475454507 b 378204498 595844306 c 442072871 545584487 d 525250287 480129839 e 498514689 501168833 f 568324306 446233682 g 470293780 523376660 h 554956507 456753179 i 455440670 535064990 j 397513541 580649477 k 612883636 411168692 l 513367799 489480503 m 465837847 5...
output:
1
result:
ok single line: '1'
Test #17:
score: 0
Accepted
time: 0ms
memory: 7956kb
input:
100 548848602 549471818 a 320148329 317853761 b 508881564 508994876 c 704275972 706882148 d 371217322 369574298 e 597697204 598943636 f 624341896 625928264 g 380098886 378569174 h 313487156 311107604 i 553289384 553969256 j 466694135 466269215 k 406743578 405553802 l 488898045 488756405 m 653206979 ...
output:
2
result:
ok single line: '2'
Test #18:
score: 0
Accepted
time: 2ms
memory: 7744kb
input:
100 509098504 507901696 w 513647756 511852544 t 638752186 620500864 f 565964154 557287296 e 438585098 446663552 s 283910530 312334720 l 702441714 675812736 g 295283660 322211840 h 561414902 553336448 b 434035846 442712704 g 688793958 663960192 n 447683602 454565248 o 320304546 343941504 c 540943268 ...
output:
2
result:
ok single line: '2'
Extra Test:
score: 0
Extra Test Passed