QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#302413 | #5045. King | LittleXi# | TL | 1022ms | 28172kb | C++20 | 3.6kb | 2024-01-10 20:46:33 | 2024-01-10 20:46:34 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll qpow(ll a, ll b, ll p)
{
ll ret = 1;
while(b)
{
if(b & 1) ret = ret * a % p;
a = a * a % p;
b >>= 1;
}
return ret;
}
int Lower(const vector<int>& vec,int x)
{
int Left=-1,Right=vec.size();
while (Left+1<Right)
{
int Mid=Left+Right>>1;
if (vec[Mid]>=x) Right=Mid;
else Left=Mid;
}
return Right;
}
int Upper(const vector<int>& vec,int x)
{
int Left=-1,Right=vec.size();
while (Left+1<Right)
{
int Mid=Left+Right>>1;
if (vec[Mid]>x) Right=Mid;
else Left=Mid;
}
return Right;
}
//(i-d, i)
int check(int i, int d, ll p, vector<ll>& b, const vector<ll>& binv, map<ll,vector<int>>& pos)
{
//printf("check(%d, %d)\n",i,d);
ll q = b[i] * binv[i-d] % p;
ll qinv = binv[i] * b[i-d] % p;
int nowans = 2;
//jump right
int nxtpos = i+1; ll nxtval = b[i] * q % p;
while(1)
{
auto it = pos.find(nxtval);
if(it == pos.end()) break;
auto& vec = it->second;
// auto jt = lower_bound(vec.begin(), vec.end(), nxtpos);
int jt=Lower(vec,nxtpos);
if (jt==vec.size()) break;
// if(jt == vec.end()) break;
//printf("jump right to %d\n",*jt);
++nowans;
// nxtpos = (*jt)+1;
nxtpos=vec[jt]+1;
nxtval = nxtval * q % p;
}
//jump left
nxtpos = i-d-1; nxtval = b[i-d] * qinv % p;
while(1)
{
auto it = pos.find(nxtval);
if(it == pos.end()) break;
auto& vec = it->second;
// auto jt = upper_bound(vec.begin(), vec.end(), nxtpos);
int jt=Upper(vec,nxtpos);
// if(jt == vec.begin()) break;
if (jt<=0) break;
--jt; ++nowans;
//printf("jump left to %d\n",*jt);
// nxtpos = (*jt)-1;
nxtpos=vec[jt]-1;
nxtval = nxtval * qinv % p;
}
//printf("i=%d, d=%d, q=%d, nowans=%d\n",i,d,q,nowans);
return nowans;
}
void solve()
{
mt19937_64 rnd(98275314);
int n; ll p; scanf("%d%lld",&n,&p);
vector<ll> b(n+1), binv(n+1);
for(int i = 1; i <= n; ++i) scanf("%lld",&b[i]), binv[i] = qpow(b[i], p-2, p);
int ans = 2;
if(n == 2)
{
printf("2\n");
return;
}
//check 1,3,5,...
if(n >= 3)
{
ll q = b[3] * binv[1] % p; bool flag = true;
for(int i = 3; i <= n; i += 2)
{
if(b[i] * binv[i-2] % p != q)
{
flag = false;
break;
}
}
if(flag) ans = max(ans, (n+1)/2);
}
//check 2,4,6,...
if(n % 2 == 0 && n >= 4)
{
ll q = b[4] * binv[2] % p; bool flag = true;
for(int i = 4; i <= n; i += 2)
{
if(b[i] * binv[i-2] % p != q)
{
flag = false;
break;
}
}
if(flag) ans = max(ans, n/2);
}
map<ll,vector<int>> pos;
for(int i = 1; i <= n; ++i) pos[b[i]].push_back(i);
for(int t = 1; t <= 50; ++t)
{
int i = abs((ll)rnd()) % (n-1) + 2;
ans = max(ans, check(i, 1, p, b, binv, pos));
}
for(int t = 1; t <= 50; ++t)
{
int i = abs((ll)rnd()) % (n-2) + 3;
ans = max(ans, check(i, 2, p, b, binv, pos));
}
if(2*ans < n) printf("-1\n");
else printf("%d\n",ans);
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3736kb
input:
4 6 1000000007 1 1 2 4 8 16 6 1000000007 597337906 816043578 617563954 668607211 89163513 464203601 5 1000000007 2 4 5 6 8 5 1000000007 2 4 5 6 7
output:
5 -1 3 -1
result:
ok 4 number(s): "5 -1 3 -1"
Test #2:
score: 0
Accepted
time: 170ms
memory: 3820kb
input:
1000 200 495189361 193302375 262009153 248101278 250233641 303504256 426913173 23261177 206011896 214770731 286184509 492688635 207979481 282629026 450810670 41818047 359796006 445343921 241742611 249404909 41291916 392252331 125287519 92825425 162555413 371172157 420486666 270651384 309213995 11709...
output:
-1 133 -1 187 163 114 114 132 100 108 116 137 115 -1 165 115 142 165 -1 -1 108 129 -1 144 122 -1 111 146 190 159 134 -1 117 180 196 -1 -1 192 123 110 -1 106 153 103 -1 -1 103 169 -1 174 152 -1 181 113 135 -1 153 199 182 -1 177 152 177 162 -1 115 -1 -1 -1 113 128 -1 -1 -1 -1 168 167 -1 140 -1 -1 -1 1...
result:
ok 1000 numbers
Test #3:
score: 0
Accepted
time: 175ms
memory: 4084kb
input:
1000 200 949663931 479217281 320985989 765005251 6434894 250659962 96381980 929176627 859155083 837781618 895381960 276913403 206799800 594561194 451400141 287326771 230131436 499694353 149062037 769076212 249680039 876506380 680573243 672238085 235553233 593493391 524937617 832401231 490042272 4494...
output:
198 -1 -1 -1 120 -1 162 -1 101 -1 103 157 188 -1 -1 177 -1 126 114 -1 177 -1 -1 150 -1 148 140 165 -1 102 -1 192 -1 -1 -1 181 149 196 -1 -1 173 147 -1 149 -1 -1 200 -1 -1 -1 -1 -1 156 -1 114 119 199 127 123 138 169 188 146 -1 137 -1 -1 -1 121 -1 -1 121 -1 -1 -1 108 117 127 -1 127 194 -1 121 -1 -1 12...
result:
ok 1000 numbers
Test #4:
score: 0
Accepted
time: 168ms
memory: 3796kb
input:
1000 200 752331551 23573436 686888652 118880475 606109605 504896777 156156511 407092389 168008046 588489051 384747939 312334251 10179640 389706827 496937297 625716990 602916042 580060754 535624296 196865310 693079720 672788885 104900220 416739470 142969723 655913476 432092835 454858443 698545241 763...
output:
-1 179 -1 -1 126 -1 189 -1 115 -1 -1 -1 175 -1 109 -1 166 190 129 -1 -1 108 -1 135 -1 174 109 -1 183 -1 -1 -1 142 -1 105 159 163 144 -1 -1 -1 124 175 135 183 132 -1 -1 115 -1 -1 130 159 -1 -1 160 138 145 196 -1 123 163 -1 -1 181 -1 137 126 111 -1 -1 110 111 148 -1 -1 131 -1 -1 -1 101 -1 -1 -1 -1 -1 ...
result:
ok 1000 numbers
Test #5:
score: 0
Accepted
time: 172ms
memory: 3860kb
input:
1000 200 952479163 404962930 635613728 875512822 126836765 893278336 93755885 802367656 41132902 703323879 109154481 793288802 49973196 534490899 462994291 829278242 789093683 134072789 384627711 513380294 28212590 922131395 333371011 352605762 351655730 28129292 473972568 10559174 951685030 7877219...
output:
-1 -1 -1 171 -1 190 -1 -1 -1 107 -1 -1 176 -1 -1 118 -1 -1 119 -1 -1 160 -1 100 -1 -1 129 190 165 -1 -1 108 -1 -1 -1 188 167 121 189 190 113 153 -1 -1 -1 -1 142 192 186 102 108 -1 -1 -1 -1 -1 137 160 143 146 163 156 163 176 135 -1 -1 -1 -1 -1 -1 -1 -1 117 -1 -1 -1 147 166 -1 200 195 189 177 -1 143 -...
result:
ok 1000 numbers
Test #6:
score: 0
Accepted
time: 333ms
memory: 4104kb
input:
100 2000 146158349 19643059 687117 30976705 141997757 126939439 27291348 99640815 77869374 140943896 108863607 47555226 24332054 20814180 9774186 95917237 54599801 123926643 144812251 18602850 105663323 135089587 86540799 102680207 83257587 98590031 102391932 51059987 8865754 980981 32147720 8025236...
output:
-1 -1 1976 -1 1443 -1 1206 1958 -1 1973 -1 -1 1294 -1 -1 -1 1223 -1 1457 1496 1860 1473 -1 -1 -1 -1 1654 -1 -1 -1 1505 1306 -1 -1 1696 -1 -1 -1 1475 1133 1189 1609 -1 -1 1397 1540 -1 1625 1191 -1 1923 -1 1835 -1 1296 -1 -1 -1 -1 1893 1705 1378 1343 -1 -1 1444 -1 -1 -1 1788 -1 1255 -1 -1 -1 -1 -1 -1 ...
result:
ok 100 numbers
Test #7:
score: 0
Accepted
time: 364ms
memory: 3992kb
input:
100 2000 275587717 83150209 104356116 34298444 197772460 101494007 261547554 223901747 141042340 131644199 60357915 86344257 81799664 202980147 152575387 115211945 7568397 260000358 100079566 95526927 11929407 165620994 44220242 62535336 42656523 39073826 149365602 253784018 119905129 214185578 2576...
output:
-1 1379 -1 -1 -1 1294 1717 -1 1569 1573 1375 -1 -1 1151 1859 1927 -1 1953 -1 1655 -1 -1 1986 -1 1019 -1 -1 1791 -1 1641 1783 1092 1488 1364 -1 1640 1875 1080 -1 1860 -1 1509 1578 -1 -1 1303 -1 1783 -1 -1 1744 1727 1525 -1 -1 1462 -1 -1 -1 -1 1316 1389 1144 -1 -1 1361 -1 1866 1334 -1 1313 1792 1286 -...
result:
ok 100 numbers
Test #8:
score: 0
Accepted
time: 325ms
memory: 4296kb
input:
100 2000 728295619 196905643 523233418 352318827 369770119 347085435 127560509 546671396 362387446 649410690 156802530 298823172 508289744 452232923 497191988 294603059 371099463 359230006 112535834 365805832 66877149 503870773 709803811 404046859 570062640 574727791 550224131 433734296 17881765 652...
output:
1982 -1 1859 1702 -1 1998 1377 -1 1731 1754 1498 1079 -1 1329 1879 -1 1334 -1 -1 1105 -1 -1 -1 1756 1165 -1 -1 -1 1328 -1 -1 1307 1815 -1 1666 1159 1263 -1 -1 -1 -1 -1 1443 -1 -1 1796 -1 1122 1310 1183 -1 -1 -1 -1 -1 1687 1122 1906 1200 -1 -1 1899 1543 -1 1487 -1 -1 -1 1885 1263 1325 -1 -1 1164 1548...
result:
ok 100 numbers
Test #9:
score: 0
Accepted
time: 364ms
memory: 4036kb
input:
100 2000 933493147 311022270 68427073 410339431 66474535 75931530 216168461 596520713 772600691 587660302 307741208 399247506 406645429 62857626 3532644 485034914 95405783 290695394 802486951 113550555 678338176 331200438 608959909 689318946 20753772 157370341 699828644 477646090 360131489 626962275...
output:
-1 1314 -1 -1 -1 1309 -1 1693 -1 1491 1438 -1 1012 1591 -1 -1 -1 1008 1917 1829 -1 1580 -1 1904 -1 1903 1155 1509 1378 1328 1050 -1 1576 -1 1752 1469 1858 -1 1261 -1 -1 1951 -1 1563 -1 1317 -1 1502 1867 -1 -1 1623 -1 -1 -1 1956 -1 -1 1215 1619 -1 -1 1852 1957 1561 -1 1493 -1 -1 1649 1110 1484 1429 1...
result:
ok 100 numbers
Test #10:
score: 0
Accepted
time: 523ms
memory: 6336kb
input:
10 20000 394172071 215340230 130633568 345392055 252111757 290095347 168672848 194628253 178431552 4977718 99966452 268841997 280806854 303621488 25038073 104682112 315461954 307022385 171592359 96110115 293022137 333987173 216781089 336833348 28521180 90994503 276664376 261103859 334641831 14856855...
output:
19880 -1 -1 13636 14129 -1 13865 -1 -1 -1
result:
ok 10 numbers
Test #11:
score: 0
Accepted
time: 427ms
memory: 6296kb
input:
10 20000 831500497 756984954 294988881 429721584 295799143 257217177 50456012 13420397 2969434 721431867 225933624 119351587 523441 211421177 294967820 42091607 225669354 190586927 101257586 45651368 244907097 778123162 44054039 684914480 764858903 102131788 351954286 780877035 439837711 428415753 7...
output:
-1 -1 -1 15494 14393 14874 -1 -1 -1 -1
result:
ok 10 numbers
Test #12:
score: 0
Accepted
time: 367ms
memory: 6144kb
input:
10 20000 905983279 751785219 756502769 317100935 46106015 81697243 113450190 218531390 732183548 337309810 77491620 16286634 236726435 305167458 104295335 503145608 404379366 171869896 258486011 272629763 713887214 873622033 534736735 24120356 224608505 36553224 379385885 317448347 393152738 8866108...
output:
-1 -1 -1 -1 -1 12977 13633 -1 14693 10329
result:
ok 10 numbers
Test #13:
score: 0
Accepted
time: 783ms
memory: 6520kb
input:
10 20000 144511651 123896984 53764446 105306768 103158669 35196311 130674500 83966631 5993612 80522785 141568416 27425680 35528114 133382 99203681 76234496 93249763 140627841 75825332 58193203 100605893 10297744 81443846 38431311 134426404 32085087 33126697 128392840 35165175 81204390 69243064 93196...
output:
16666 17656 -1 -1 -1 -1 14609 17394 18594 13681
result:
ok 10 numbers
Test #14:
score: 0
Accepted
time: 1022ms
memory: 28172kb
input:
1 200000 503181461 107429481 294405700 206565826 495988566 37179765 6546199 110332231 437691313 274385052 421520839 85026366 327233500 143699080 63667028 327938631 27533615 355276066 487285084 407716484 302709200 376088216 363588280 378116327 196388430 357959260 412581280 391371092 422167063 3623876...
output:
118278
result:
ok 1 number(s): "118278"
Test #15:
score: -100
Time Limit Exceeded
input:
1 200000 675454867 380042934 556489164 434552374 495189650 369846868 6899165 654717118 562979032 544560057 236120079 673341859 340171590 626783457 137792322 605431841 197948736 156566705 177828951 135991396 96059783 457411474 584395061 6813347 75601485 218667838 124496749 494264789 71692566 28824401...